我已经根据http://ialekseev.blogspot.co.uk/2012/10/dependency-injection-in-aspnet-mvc-3.html创建了一个自定义 ControllerActionInvoker,因此 Castle.Windsor 可以解决我的自定义操作中的依赖关系。
然而,我注意到,即使我在控制器工厂中明确解析了 ControllerActionInvoker,但当我使用 Glimpse 时,它实际上并没有被执行:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel kernel;
public WindsorControllerFactory(IKernel kernel)
{
this.kernel = kernel;
}
public override void ReleaseController(IController controller)
{
kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
var controller = kernel.Resolve(controllerType) as Controller;
// Resolve new action invoker
if (controller != null)
{
controller.ActionInvoker = kernel.Resolve<IActionInvoker>();
}
return controller;
}
}
下面是我的动作调用器,它带有一个扩展方法来注入属性:
public class WindsorActionInvoker : ControllerActionInvoker
{
private readonly IKernel kernel;
public WindsorActionInvoker(IKernel kernel)
{
this.kernel = kernel;
}
protected override ActionExecutedContext InvokeActionMethodWithFilters(
ControllerContext controllerContext,
IList<IActionFilter> filters,
ActionDescriptor actionDescriptor,
IDictionary<string, object> parameters)
{
foreach (IActionFilter actionFilter in filters)
{
// Extension method
kernel.InjectProperties(actionFilter);
}
return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
}
}
因此,现在我看到在我期望 Castle.Windsor 注入的类型的操作中引发了对象引用错误:
public class CheckCountryFilter : ActionFilterAttribute
{
public IAppSettings Settings { get; set; }
public ILookupService LookupService { get; set; }
public ILogger Logger { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Logger is null!
if (Logger.IsDebugEnabled)
我认为 Glimpse 以某种方式代理了 controller.ActionInvoker,用它自己的替换了我的?
有没有我可以用我的自定义 ControllerActionInvoker 让 Glimpse 玩得更好?
奇怪的是,Glimple 在第一次运行时工作,但现在我遇到了这些错误!
在 GitHub 上找到了一篇帖子 - https://github.com/Glimpse/Glimpse/issues/328 - 似乎报告了类似的问题。通过忽略 ExecutionInspector Glimpse 确实有效,我的调用程序解决了依赖关系,但我显然失去了 Glimpse 中的许多有用信息!
这是我唯一的选择吗?