ASP.NET MVC 3 - встроенное разъяснение внедрения зависимостей - PullRequest
0 голосов
/ 24 августа 2011

Я нахожусь в процессе обновления приложения ASP.NET MVC 2 до ASP.NET MVC 3. Одно из улучшений в версии 3, о котором я читал, - внедрение зависимостей и встроенный локатор служб.До сих пор я понимаю, что я могу удалить свое влияние на фабрику контроллеров и вместо этого реализовать интерфейс IDependencyResolver.Теперь все, что мне нужно сделать, это изменить следующее в моем методе Application_Start:

var container = new UnityContainer();
...
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));

на:

var container = new UnityContainer();
...
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

Пока все хорошо, но я видел отчеты, которые мне также нужныреализовать IControllerActivator.Примеры, которые я видел, просто показывают, как это использует средство определения зависимостей, поэтому я не могу понять, почему реализация по умолчанию не делает это автоматически.Если бы кто-то мог объяснить это, было бы здорово.Я предполагаю, что мне нужно реализовать этот интерфейс, чтобы получить инъекцию конструктора в мои контроллеры.Но как бы я внедрить зависимость внутри, скажем, фильтр действий.Раньше я бы сказал:

var authorizationService = ServiceLocator.Current.GetInstance<IAuthorizationService>();

Я знаю, что, возможно, смогу отключить это, чтобы использовать новый DependencyResolver, но я подумал, что с ASP.NET MVC 3 это позволит мне привести в порядок это иначе, я неЯ не понимаю, чем DependencyResolver отличается от ServiceLocator.

Буду признателен, если вы поможете прояснить некоторые из моих проблем, поскольку я хотел бы полностью понять кое-что, прежде чем приступить к осуществлению и реализовать его.

Спасибо

1 Ответ

0 голосов
/ 25 августа 2011

Вам не нужно реализовывать IControllerActivator для поддержки внедрения конструктора - его возможность вы получаете, используя любой «хороший» IoC-контейнер, например Ninject.

Пожалуйста, посмотрите пример:исходный код ' Часть I \ 10 - Обзор проектов MVC \ 10 - Обзор проектов MVC \ 2.Консолидация DI '' для книги ' Pro ASP.NET MVC 3 Framework '.

Для меня, без сомнения, это будет работать и с Unity.

...