gpt4 book ai didi

asp.net-mvc - MVC 3 的 CaSTLe Windsor 依赖解析器

转载 作者:行者123 更新时间:2023-12-03 08:49:11 24 4
gpt4 key购买 nike

由于 MVC 3 中的 IoC/DI 实现很可能是 RC 中的最终形式,因此我正在寻找使用 Caste Windsor 的 DependencyResolver、IControllerActivator 和 IViewPageActivator 的更新实现。有没有针对 MVC 3 RC 更新的示例?

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

DependencyResolver.SetResolver(new WindsorDependencyResolver(container)); 

温莎抛出 ComponentNotFoundException。我需要为 IControllerFactory 和 IControllerActivator 提供实现。由于 DefaultControllerFactory 支持 DependencyResolver,因此可以通过以下方式解决:
Component.For<IControllerFactory >().ImplementedBy<DefaultControllerFactory>()
Component.For<IControllerActivator >().ImplementedBy<WindsorControllerActivator>(),

WindsorControllerActivator 也很简单。但是,这会导致 IViewPageActivator 出现另一个 ComponentNotFoundException。

这让我相信我错过了一些东西。这不可能比实现 Controller 工厂和调用 ControllerBuilder.Current.SetControllerFactory MVC 2.0 风格更复杂。

编辑#2
我错过了当找不到服务时依赖解析器需要返回 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[]{};
}
}

编辑#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
根据一些进一步的研究和反馈,似乎传统的 Controller 工厂实现是 Windsor 和 MVC3 的最佳方法。令人担忧的是 IDependencyResolver 接口(interface)缺少释放方法,这可能会导致 Windsor 不释放其组件而导致内存泄漏。如果您的所有依赖项都通过 PerWebRequest 生命周期解决,这可能不会成为问题,但最好还是不要冒险。这是 MVC3 的 Windsor Controller 工厂的基本实现。
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
如果您使用的是 MVC 区域,则上述实现将不适合您。您将需要根据其全名注册每个 Controller ,并覆盖 GetControllerInstance 而不是 CreateController:
 protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
if (controllerType != null)
{
return (IController)container.Kernel.Resolve(controllerType);
}
return null;
}

最佳答案

MVC3的IDependencyResolver接口(interface)有个大问题:没有释放方法。这意味着如果您打算将它与 Windsor 一起使用,则可能存在内存泄漏。在这里查看我的博客文章:

http://mikehadlow.blogspot.com/2011/02/mvc-30-idependencyresolver-interface-is.html

关于asp.net-mvc - MVC 3 的 CaSTLe Windsor 依赖解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4140860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com