Таким образом, 99% всех примеров внедрения зависимостей, использующих шаблон репозитория с MVC (или веб-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 на уровень, требующий этого.
Любая помощь в этом приветствуется, спасибо!