Я только что начал использовать Unity с MVC, и я столкнулся с этим, что я вижу как немного дублирование кода. Рассмотрим следующий шаблон управления/Модель:Инъекционная зависимость для моделей
Контроллер:
public class MyController : Controller {
private readonly IDependency1 _dependency1;
private readonly IDependency2 _dependency2;
private readonly IDependency3 _dependency3;
public MyController(
IDependency1 dependency1,
IDependency2 dependency2,
IDependency3 dependency3
) {
}
public ActionResult Thingy() {
var model = new Thingy(_dependency1, _dependency2, _dependency3);
model.DoLogic();
model.SetUpView();
model.Finalize();
return View(model);
}
}
Модель:
public class Thingy {
private readonly IDependency1 _dependency1;
private readonly IDependency2 _dependency2;
private readonly IDependency3 _dependency3;
public Thingy(
IDependency1 dependency1,
IDependency2 dependency2,
IDependency3 dependency3
) {
}
// Now I can use my dependencies
}
Это позволяет мне реализовать тощие контроллеры/тучные модели, однако сейчас я дублируя зависимых в обоих контроллерах & Модель.
Я видел, что я могу использовать атрибуты в моей модели:
public class Thingy {
[Dependency]
public IDependency1 Dependency1 { private get; set; };
[Dependency]
public IDependency2 Dependency2 { private get; set; };
[Dependency]
public IDependency3 Dependency3 { private get; set; };
}
Затем инициализировать мою модель в своем действии так:
public ActionResult Thingy() {
// No need to pass in via constructor
var model = DependencyResolver.Current.GetService<Thingy>();
}
Nice & постное от кодирования POV, но я прочитал что это анти-шаблон?
В: Почему это считается анти-шаблоном и я могу изменить свою структуру, чтобы предотвратить дублирование кода?
Зачем вам нужна жирная модель? Вы действительно думаете, что ваша модель должна знать мнение? Может ли эта модель использоваться в web/mobile/embedded (обычно используется повторно)? Не должен ли Контролер быть тем, кто занимается «мышлением» и организацией. В представлении должны отображаться данные. Модель - это данные? – Belogix
Анти-шаблон заключается в том, что ваша модель содержит зависимости. Модель должна быть простой старой DTO; просто данные, никакого поведения. Вы должны только возвращать объекты данных обратно в представление, так как представление не может (легко) быть проверено, а перемещение логики в модель увеличивает сложность. – Steven
Я вижу, это имеет смысл - благодаря обоим - я буду реорганизовывать контроллер :) – CodingIntrigue