asp.net-mvc – 用于MVC 3的Castle Windsor依赖关系解析器
|
由于MVC 3中的IoC / DI实现最有可能是在RC的最终形式,我正在寻找使用Caste Windsor的DependencyResolver,IControllerActivator和IViewPageActivator的更新实现。有没有为MVC 3 RC更新的任何示例? 编辑#1 DependencyResolver.SetResolver(new WindsorDependencyResolver(container)); Windsor抛出ComponentNotFoundException。我需要提供IControllerFactory和IControllerActivator的实现。由于DefaultControllerFactory是DependencyResolver感知,这可以解决如下: Component.For<IControllerFactory >().ImplementedBy<DefaultControllerFactory>() Component.For<IControllerActivator >().ImplementedBy<WindsorControllerActivator>(), WindsorControllerActivator也是微不足道的。但是,这导致IViewPageActivator的另一个ComponentNotFoundException。 这使我相信,我错过了一些东西。没有办法,这应该比实现一个控制器工厂和调用ControllerBuilder.Current.SetControllerFactory MVC 2.0风格更复杂。 编辑#2 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[]{};
}
}
编辑#3 回应评论中的问题。如果你发现你需要你自己的IControllerActivator,这里是一个简单的实现Windsor: public class WindsorControllerActivator : IControllerActivator
{
private readonly IWindsorContainer container;
public WindsorControllerActivator(IWindsorContainer container)
{
this.container = container;
}
public IController Create(RequestContext requestContext,Type controllerType)
{
return (IController)container.GetService(controllerType);
}
}
}} 同样,这不是必要的基本DI使用Windsor和MVC3依赖解析器。 编辑#4 public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer container;
public WindsorControllerFactory(IWindsorContainer container)
{
this.container = container;
}
public override void ReleaseController(IController controller)
{
container.Kernel.ReleaseComponent(controller);
}
public override IController CreateController(RequestContext requestContext,string controllerName)
{
var controllerComponentName = controllerName + "Controller";
return container.Kernel.Resolve<IController>(controllerComponentName);
}
}
编辑#5 protected override IController GetControllerInstance(RequestContext context,Type controllerType)
{
if (controllerType != null)
{
return (IController)container.Kernel.Resolve(controllerType);
}
return null;
}
解决方法接口自beta版本以来没有改变,所以各种框架的所有实现仍然应该工作。事实是,这不是一个接口的复杂 – 你应该能够自己滚动没有很多麻烦。例如,我为Ninject做了这个:public class NinjectDependencyResolver : IDependencyResolver
{
public NinjectDependencyResolver(IKernel kernel)
{
_kernel = kernel;
}
private readonly IKernel _kernel;
public object GetService(Type serviceType)
{
return _kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _kernel.GetAll(serviceType);
}
}
然后连接到global.asax像这样: private static IKernel _kernel;
public IKernel Kernel
{
get { return _kernel; }
}
public void Application_Start()
{
_kernel = new StandardKernel(new CoreInjectionModule());
DependencyResolver.SetResolver(new NinjectDependencyResolver(Kernel));
...
}
记住,你在这一点上免费获得各种好东西,包括控制器的DI,控制器工厂,动作过滤器和视图基类。 编辑:要清楚,我不知道你的“激活剂”是什么,但你可能不需要它们。 IDependencyResolver接口自动处理控制器和视图的新建。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- IIS7集成vs经典流水线 – 哪些使用更多的ASP.NET线程?
- asp.net – 有一个可靠的方法来防止在匿名用户可以投票的基
- asp.net-mvc – 为什么我的样式表重定向到我的登录?
- asp.net-mvc – Bug? ASP.NET MVC 2中的客户端验证导致Val
- asp.net-mvc-3 – 如何有效地从自相关表中加载数据
- asp.net-mvc – 将集合传递给EditorFor()时,它会为输入元素
- asp.net-mvc – ASP.NET MVC – CustomeAuthorize使用外部网
- macos – ASP.NET CORE 2.1预览“Csc”任务不支持“SharedC
- asp.net – 在后面的代码中通过jquery添加列表框项的问题
- 为什么我需要停止使用%= ...%来渲染并开始使用Asp.net中的
- asp.net-web-api – Web API 2 OWIN承载令牌认证
- 可以使用ASP.NET路由为.ashx(IHttpHander)处理程
- asp.net – Visual Studio和C#的竞争对手
- asp.net-mvc – 如何将Model字段值传递给javascr
- 在ASP.NET应用程序中使用Ajax更新面板的优点和缺
- asp.net-mvc-3 – 什么是MVC 3中的ModelState类?
- asp.net-mvc – 升级到MVC 3:CS0103:名称’视图
- asp.net – 在.NET 4.6升级后,w3wp.exe与ThreadA
- 为什么NuPack生成的NinjectMVC3.cs无法编译? (或
- asp.net – 普通Web API或Web API和OData?
