相关疑难解决方法(0)

Castle Windsor依赖Resolver for MVC 3

由于MVC 3中的IoC/DI实现很可能是RC中的最终形式,我正在寻找使用Caste Windsor的DependencyResolver,IControllerActivator和IViewPageActivator的更新实现.有没有为MVC 3 RC更新过的例子?

编辑#1 实现Windsor依赖解析器确实是微不足道的,但仍然缺少一些东西.与Jeff Putz的Ninject示例(下图)相反,它似乎并不像Windsor那么简单.设置依赖解析器之后,

DependencyResolver.SetResolver(new WindsorDependencyResolver(container)); 
Run Code Online (Sandbox Code Playgroud)

Windsor抛出ComponentNotFoundException.我需要为IControllerFactory和IControllerActivator提供实现.由于DefaultControllerFactory是DependencyResolver,因此可以按如下方式解决:

Component.For<IControllerFactory >().ImplementedBy<DefaultControllerFactory>()
Component.For<IControllerActivator >().ImplementedBy<WindsorControllerActivator>(),
Run Code Online (Sandbox Code Playgroud)

WindsorControllerActivator也是微不足道的.但是,这会导致IViewPageActivator的另一个ComponentNotFoundException.

这让我相信我错过了什么.没有办法比实现一个控制器工厂和调用ControllerBuilder.Current.SetControllerFactory MVC 2.0风格更复杂.

编辑#2 我错过了在无法找到服务时Dependency解析器需要返回null的微妙但重要的细节.实施如下:

public class WindsorDependencyResolver : IDependencyResolver
{
    private readonly IWindsorContainer container;

    public WindsorDependencyResolver(IWindsorContainer container)
    {
        this.container = container;
    }

    public object GetService(Type serviceType)
    {
        return container.Kernel.HasComponent(serviceType) ? container.Resolve(serviceType) : null;
    }

  public IEnumerable<object> GetServices(Type serviceType)
    {
        return container.Kernel.HasComponent(serviceType) ? container.ResolveAll(serviceType).Cast<object>() : new object[]{};
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑#3

回答评论中的问题.如果你确实发现你需要自己的IControllerActivator,这里有一个简单的Windsor实现:

public class WindsorControllerActivator : IControllerActivator
{
    private readonly IWindsorContainer container;

    public WindsorControllerActivator(IWindsorContainer container) …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc castle-windsor asp.net-mvc-3

32
推荐指数
2
解决办法
1万
查看次数

我可以在单层或每个使用的层中注册所有IoC容器组件吗?

我正在使用Unity IoC框架,并Bootstrapper.cs在我的主机MVC层中有一个类来注册所有组件.然而,在我的建筑我有MVC层下方的"服务"层,即也使用DI并有库接口注入到它(库接口未在MVC层使用-它注入到其控制器的服务层接口) .

所以我的问题如下:我是否仍然可以将存储库接口注册到整个应用程序的MVC/UI层中的具体类型,或者我是否添加对Unity的另一个引用并Bootstrapper.cs在我的"服务"层中创建另一个类来定义接口特定图层使用的类型?

即使答案是我可以在UI层注册界面,我仍然想知道常见的做法.我喜欢在MVC/UI层中注册该类型的事情是我必须添加对Repository层的引用才能进行注册,甚至知道它不在该层中使用.它用在服务层中.

谢谢!

c# inversion-of-control unity-container

1
推荐指数
1
解决办法
2519
查看次数