我想使用this文章的方法,但我错过了一些东西 - 我目前在WindsorControllerFactory.GetControllerInstance中出现错误,因为WindsorActionInvoker对IWindsorContainer有依赖关系时它会尝试解析IActionInvoker 。Castle Windsor - 注入IActionInvoker实现问题
鉴于WindsorControllerFactory已经有了对IWindsorContainer的引用,我可以在那里传递该引用吗?如果是这样 - 如何?我发现的唯一例子是关于传递值类型作为构造函数参数,而不是引用类型。
我感觉我失去了一些东西明显...
当前设置如下: 在Global.asax中的Application_Start我叫下面的方法:
protected virtual IWindsorContainer InitializeServiceLocator()
{
IWindsorContainer container = new WindsorContainer();
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));
container.RegisterControllers(typeof(HomeController).Assembly);
ComponentRegistrar.AddComponentsTo(container);
return container;
}
ComponentRegistrar:
public static void AddComponentsTo(IWindsorContainer container)
{
//add other components.....
container.AddComponentLifeStyle<IActionInvoker, WindsorActionInvoker>(LifestyleType.PerWebRequest);
}
WindsorActionInvoker:
public class WindsorActionInvoker : ControllerActionInvoker, IActionInvoker
{
readonly IWindsorContainer container;
public WindsorActionInvoker(IWindsorContainer container)
{
this.container = container;
}
protected override ActionExecutedContext InvokeActionMethodWithFilters(
ControllerContext controllerContext,
IList<IActionFilter> filters,
ActionDescriptor actionDescriptor,
IDictionary<string, object> parameters)
{
foreach (IActionFilter actionFilter in filters)
{
container.Kernel.InjectProperties(actionFilter);
}
return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
}
}
WindsorControllerFactory:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer container;
public WindsorControllerFactory(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
public override void ReleaseController(IController controller)
{
var disposable = controller as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
this.container.Release(controller);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(requestContext, controllerType);
}
var controller = this.container.Resolve(controllerType) as Controller;
if (controller != null)
{
controller.ActionInvoker = this.container.Resolve<IActionInvoker>(this.container);
}
return controller;
}
}
更新
我错过了一个细微之处:我试图用这种行为为以下:
public class CustomAuthorize : AuthorizeAttribute {...}
不执行IActionFilter
。
增加了以下内容WindsorActionInvoker:
protected override AuthorizationContext InvokeAuthorizationFilters(ControllerContext controllerContext, IList<IAuthorizationFilter> filters, ActionDescriptor actionDescriptor)
{
foreach (IAuthorizationFilter authorizeFilter in filters)
{
this.kernel.InjectProperties(authorizeFilter);
}
return base.InvokeAuthorizationFilters(controllerContext, filters, actionDescriptor);
}
要求这现在工作。感谢Cristiano,因为它分析了他亲切的代码,使我走上了正确的道路。
感谢 - 这让我有点进一步 - 然而InvokeActionMethodWithFilters没有得到执行,所以我的财产的依赖性永远不会被注入。 – BonyT
我编辑完整的实施我的答案。它适用于我很好 – Crixo
非常感谢您的亲切努力 - 我会试试这个。 – BonyT