由于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) 我正在使用Unity IoC框架,并Bootstrapper.cs在我的主机MVC层中有一个类来注册所有组件.然而,在我的建筑我有MVC层下方的"服务"层,即也使用DI并有库接口注入到它(库接口未在MVC层使用-它注入到其控制器的服务层接口) .
所以我的问题如下:我是否仍然可以将存储库接口注册到整个应用程序的MVC/UI层中的具体类型,或者我是否添加对Unity的另一个引用并Bootstrapper.cs在我的"服务"层中创建另一个类来定义接口特定图层使用的类型?
即使答案是我可以在UI层注册界面,我仍然想知道常见的做法.我不喜欢在MVC/UI层中注册该类型的事情是我必须添加对Repository层的引用才能进行注册,甚至知道它不在该层中使用.它用在服务层中.
谢谢!