Должен ли (и если да, то как) контекст базы данных вводиться зависимостью в контроллер? - PullRequest
3 голосов
/ 25 апреля 2011

Похоже, что по крайней мере 90 +% написанных мной действий контроллера потребуется для доступа к базе данных.Для меня это кажется логичным шагом для автоматического ввода контекста базы данных.

Я никогда не использовал инъекцию зависимостей, поэтому хочу подтвердить, что это шаблон.Если да, то как мне это сделать?Я знаю, что ASP.NET MVC 3 имеет улучшенную поддержку внедрения зависимостей, но мне все еще нужна внешняя структура?Если да, что является значением по умолчанию и как мне настроить его для создания нового контекста базы данных для каждого запроса http?

1 Ответ

1 голос
/ 25 апреля 2011

ASP.NET MVC 3 не имеет улучшенной поддержки DI - в нем улучшена поддержка анти-паттерна Service Locator (см. Рисунок). К счастью, он поддерживает DI начиная с MVC 1 через интерфейс IControllerFactory.

Однако, чтобы ответить на вопрос, да, звучит совершенно нормально, если вставить репозиторий в контроллер (хотя обычно мы вставляем модель предметной области между ними). ​​

Лучше всего это сделать с помощью Конструкторской инъекции , например:

public class MyController
{
    private readonly IMyRepository repository;

    public MyController(IMyRepository repository)
    {
        if (repository == null)
        {
            throw new ArgumentNullException("repository");
        }

        this.repository = repository;
    }

    public ViewResult MyAction(int barId)
    {
        var bar = this.repository.SelectBar(barId);
        return this.View(bar);
    }
}

Вам потребуется предоставить собственный IControllerFactory, чтобы включить конструктор Injection с помощью инфраструктуры MVC - проще всего получить его из DefaultControllerFactory.

Если у вас есть собственный IControllerFactory, вы можете зарегистрировать его в Global.asax следующим образом:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
...