Glimpse 1.4.2,Castle.Windsor 3.0和自定义ASP.NET MVC 3 ControllerActionInvoker

时间:2013-07-11 12:26:17

标签: asp.net-mvc dependency-injection castle-windsor

我已根据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在某种程度上代理了控制器.ActionInvoker,用自己的替换我的?

我可以通过我的自定义ControllerActionInvoker让Glimpse玩得很好吗?

奇怪的是,Glimple第一次参加了比赛,但现在我已经遇到了这些错误!

在GitHub上发现了一个帖子 - https://github.com/Glimpse/Glimpse/issues/328 - 似乎报告了类似的问题。 通过忽略ExecutionInspector,Glimpse可以正常工作,我的调用程序可以解决依赖关系,但我显然失去了Glimpse的大量有用信息!

这是我唯一的选择吗?

0 个答案:

没有答案