ASP.NET MVC3 - Используйте DependencyResolver И Виндзорский замок: почему? - PullRequest
2 голосов
/ 29 мая 2011

Может ли кто-нибудь пролить немного света на меня?

Мой сайт работает с использованием Виндзорского замка.У меня есть фабрика контроллеров и инсталляторы для контроллеров и сервисов.Все хорошо.

Теперь я только что создал IDependencyResolver реализующий класс с именем WindsorDependencyResolver с простой реализацией:

public class WindsorDependencyResolver : System.Web.Mvc.IDependencyResolver
{
    private readonly IKernel _kernel;

    public WindsorDependencyResolver (IKernel kernel)
    {
        _kernel = kernel;
    }

    public object GetService(Type serviceType)
    {
        return _kernel.Resolve(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _kernel.ResolveAll(serviceType) as IEnumerable<object>;
    }
}

У меня настроен так (global.asax):

DependencyResolver.SetResolver(new WindsorDependencyResolver(kernel));

И что теперь?Когда это «используется»?Должен ли я прекратить использование kernel.Resolve(someType)?

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

Похоже, у вас уже есть собственный IControllerFactory. Если так, просто придерживайтесь этого. Это гораздо лучшее решение, чем взломать IDependencyResolver (, у которого много проблем ).

2 голосов
/ 29 мая 2011

Насколько я понимаю, IDependencyResolver - это то, что внутренне используется MVC 3 для определения местоположения службы / инверсии управления.Поэтому для того, чтобы ваши контроллеры были должным образом созданы и могли внедрять любые зависимости, которые у вас есть, вы должны указать MVC, как взаимодействовать с используемым вами контейнером (в вашем случае Windsor).

Вы все равнохотите использовать kernel.Resolve (someType), когда вам нужно извлечь что-то из контейнера, который не был введен для вас через конструктор / внедрение свойства.

Интересно, что документация MSDN указывает на Блог Брэда УилсонаДля получения подробной информации отправьте на IDependencyResolver.

...