Така че 99% от всички DI примери, използващи модела на Repository с MVC (или Web API), показват нещо подобно на това по-долу в действие на контролер (изпуснат код за инжектиране на конструктор за _repository
). Проблемът е, че има предположение, че нищо не трябва да се обработва първо (като правила) и започването на постоянство възниква незабавно:
public ActionResult Create(Person person)
{
if (ModelState.IsValid)
{
_repository.Add(person);
}
return View(person);
}
Проблемът е, какво ще стане, ако трябва да обработя правила в слоя на домейна, преди да запазя обекта person
? Очевидно не правя тази логика в контролера, а по-скоро имам нужда от нея в слоя на домейна. Кой вариант по-долу е по-добър:
Опция 1: Преместете всички подробности за постоянство в хранилището, което ще бъде извикано в домейна/бизнес слоя, и изтеглете от контролера. Актуализираният код ще изглежда така:
if (ModelState.IsValid)
{
using (busniessLogic = new MyApp.BusniessLogic(_repository))
{
busniessLogic.ProcessRulesAndSavePerson(person);
}
}
Слоят на домейна може да има метод като този:
public void ProcessRulesAndSavePerson(Person person)
{
//process some rules...
if(rules = true)
{
//use injected repository to add now that rules have passed
_repository.Add(person)
}
}
Опция 2: Запазете същото като сега в контролера, но просто направете извикване, за да обработите правилата, преди да запазите в хранилището. Актуализираният код е като по-долу:
if (ModelState.IsValid)
{
using (busniessLogic = new MyApp.BusniessLogic())
{
busniessLogic.ProcessRulesAboutPerson(person);
_repository.Add(person)
}
}
Отворен съм и за други идеи, но клоня към Вариант №1. Обичам да поддържам контролера тънък и просто да предавам инжектирания _repository към слоя, който го изисква.
Оценява се всяка помощ по този въпрос, благодаря!