Я рассмотрел более простые приложения, такие как Nerddinner и ContactManager, а также более сложные, такие как Kigg. Я понимаю более простые, и теперь я хотел бы понять более сложные.Принимая мой MVC на следующий уровень: DI и блок работы
Обычно простые приложения имеют классы и интерфейсы репозитория (как они слабо связаны друг с другом, как они могут быть) поверх LINQtoSQL или Entity Framework. Репозитории вызываются из контроллеров для выполнения необходимых операций с данными.
Один общий шаблон я вижу, когда я рассматриваю более сложные приложения, такие как Kigg или Oxite является введение (я только царапать поверхность здесь, но я должен начать где-то):
- МОК DI (в Kigg-х дело Unity)
- Web менеджер Запрос Lifetime
- Единица работы
Вот мои вопросы:
Я понимаю, что для того, чтобы действительно иметь слабосвязанное приложение, вы должны использовать что-то вроде Unity. Но также кажется, что, как только вы внедряете Unity в микс, вам также нужно представить Web Lifetime Manager. Почему это? Почему в примерах приложений, таких как Nerddinner, нет диспетчера жизненных циклов веб-запросов? Что именно он делает? Это единственная особенность?
Второй образец, который я замечаю, - это введение Единицы работы. Опять же, тот же вопрос: почему Nerddinner или ContactManager не используют Единицу работы? Вместо этого эти приложения используют классы репозитория поверх Linq2Sql или Entity Framework для обработки данных. Никаких признаков какой-либо Единицы работы. Что именно это и зачем его использовать?
Благодаря
Ниже приведен пример DI в Nerddiner на уровне DinnersController:
public DinnersController()
: this(new DinnerRepository()) {
}
public DinnersController(IDinnerRepository repository) {
dinnerRepository = repository;
}
Так я прав предположить, что из-за первого конструктора контроллер «владеет» DinnerRepository и будет поэтому зависеть от времени жизни контроллера, так как он объявлен там?
Спасибо! Это помогло. Я редактировал мой вопрос внизу. Это то, что вы имеете в виду, когда говорите, что контроллер владеет ссылкой на контекст репозитория/данных? – Thomas
Не совсем. В NerdDinner они используют дополнительный конструктор, принимающий IDinnerRepository, чтобы упростить модульные тесты. Но да, это все равно либо контроллер (конструктор без параметров), либо тесты, которые создают и владеют объектом репозитория. Они оба умирают, и нет других пользователей репозитория; поэтому жизнь проста. Кстати, такая техника плохая; вы можете узнать больше об этом здесь: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx (также как google для «IoC бедного человека»). – queen3
Аргумент Джимми Богарда об этом, являющемся наглядным примером «IoC бедного человека», здесь очень хорош. Замечания также хороши. Определенно стоит прочитать. –