异常过滤器MVC - 依赖注入

时间:2014-05-08 07:25:14

标签: asp.net-mvc

我没有在OnException方法中获取logger实例。我正在使用IunityContainer并在Global.asax中初始化

请帮我纠正代码。

由于

public class InjectIntoActionInvoker : ControllerActionInvoker
    {
        private IUnityContainer _container;

        public InjectIntoActionInvoker(IUnityContainer container)
        {
            _container = container;
        }

        protected override ActionExecutedContext InvokeActionMethodWithFilters(
            ControllerContext controllerContext,
            IList<IActionFilter> filters,
            ActionDescriptor actionDescriptor,
            IDictionary<string, object> parameters)
        {
            foreach (IActionFilter filter in filters)
            {
                _container.BuildUp(filter.GetType(), filter);
            }

            return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
        }

    }


private ILogger logger;

        [Dependency]
        public ILogger _logger
        {
            get
            { 
                return this.logger; 
            }

            set
            {
                if (value != null)
                {
                    this.logger = value;
                }
            }
        }

        public void OnException(ExceptionContext filterContext)
        {
            if (filterContext != null && filterContext.Exception!=null)
            {
                _logger.LogError(filterContext.Exception.Message, filterContext.Exception);
            }

        }

    }

public static class Bootstrapper
    {

        public static IUnityContainer Initialise()
        {
            var container = BuildUnityContainer();
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
            return container;
        }

        private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer();
            RegisterTypes(container);
            return container;
        }


        public static void RegisterTypes(IUnityContainer container)
        {
            container.RegisterInstance<ILogger>(new Logger());
            container.RegisterType<IActionInvoker, InjectIntoActionInvoker>();
        }
    }

2 个答案:

答案 0 :(得分:0)

尝试在构造函数中注入记录器...

    public InjectIntoActionInvoker(IUnityContainer container, ILogger lo)
    {
        _container = container;
        this._logger = lo;
    }

答案 1 :(得分:0)

我真的不相信如果不使用控制器工厂,这对你有用。我从here窃取了代码示例,但这可以让您对如何创建客户控制器工厂有一个很好的了解,该工厂还配置了自定义动作调用程序:

public class MyControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext context, string controllerName)
    {
        var controller = base.CreateController(context, controllerName);
        return ReplaceActionInvoker(controller);
    }

    private IController ReplaceActionInvoker(IController controller)
    {
        var mvcController = controller as Controller;
        if (mvcController != null)
            mvcController.ActionInvoker = new ControllerActionInvokerWithDefaultJsonResult();
        return controller;
    }
}

public class ControllerActionInvokerWithDefaultJsonResult : ControllerActionInvoker
{
    public const string JsonContentType = "application/json";

    protected override ActionResult CreateActionResult(ControllerContext controllerContext, ActionDescriptor actionDescriptor, object actionReturnValue)
    {
        if (actionReturnValue == null)
            return new EmptyResult();

        return (actionReturnValue as ActionResult) ?? new ContentResult()
        {
            ContentType = JsonContentType,
            Content = JsonConvert.SerializeObject(actionReturnValue)
        };
    }
}

如果需要,您仍然可以在不同的程序集中使用自定义操作调用程序和控制器工厂。