2015-01-22 2 views
0

Я только что начал использовать 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, но я прочитал что это анти-шаблон?

В: Почему это считается анти-шаблоном и я могу изменить свою структуру, чтобы предотвратить дублирование кода?

+1

Зачем вам нужна жирная модель? Вы действительно думаете, что ваша модель должна знать мнение? Может ли эта модель использоваться в web/mobile/embedded (обычно используется повторно)? Не должен ли Контролер быть тем, кто занимается «мышлением» и организацией. В представлении должны отображаться данные. Модель - это данные? – Belogix

+3

Анти-шаблон заключается в том, что ваша модель содержит зависимости. Модель должна быть простой старой DTO; просто данные, никакого поведения. Вы должны только возвращать объекты данных обратно в представление, так как представление не может (легко) быть проверено, а перемещение логики в модель увеличивает сложность. – Steven

+0

Я вижу, это имеет смысл - благодаря обоим - я буду реорганизовывать контроллер :) – CodingIntrigue

ответ

2

Да, это анти-шаблон. Одна причина - избыточный код. Если вы хотите заменить контейнер IoC (например, NInject), вам нужно изменить код контроллера и модели. Это нарушает принцип Open/closed (http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)). Кроме того, вам будет сложно выполнить контроллер тестирования устройства.

Смежные вопросы