ASP.NET MVC3 - 使用DependencyResolver和Windsor Castle:为什么?

时间:2011-05-29 15:00:08

标签: asp.net-mvc-3 dependency-injection castle-windsor ioc-container

有人可以为我发光吗?

我的网站全部使用温莎城堡。我有一个控制器工厂和控制器和服务的安装程序。一切都很好。

现在我刚刚创建了一个名为IDependencyResolver的{​​{1}}实现类,其中包含直接实现:

WindsorDependencyResolver

我已经设置了这样的设置(global.asax):

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>;
    }
}

现在怎么样?什么时候“使用”?我应该停止使用DependencyResolver.SetResolver(new WindsorDependencyResolver(kernel)); 吗?

2 个答案:

答案 0 :(得分:2)

我的理解是IDependencyResolver是MVC 3内部用于执行服务位置/控制反转的内容。因此,为了让您的控制器能够正确实例化,并能够注入您拥有的任何依赖项,您需要告诉MVC如何与您使用的容器(在您的情况下为Windsor)进行通信。

当你需要通过构造函数/属性注入从容器中取出一些东西时,你仍然想要使用kernel.Resolve(someType)。

有趣的是,MSDN文档指向IDependencyResolver上的Brad Wilson's Blog Post以获取详细信息。

答案 1 :(得分:2)

听起来你已经有了一个自定义的IControllerFactory。如果是这样,只要坚持下去。这是一个比IDependencyResolver(which has lots of problems)的黑客更好的解决方案。