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());