2

Castle.Windsor がカスタム アクションの依存関係を解決できるように、http://ialekseev.blogspot.co.uk/2012/10/dependency-injection-in-aspnet-mvc-3.htmlに従ってカスタム ControllerActionInvoker を作成しました。

ただし、コントローラー ファクトリで 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 から多くの有用な情報を失います!

これは私の唯一のオプションですか?

4

0 に答える 0