【问题标题】:Injecting Services into Filters将服务注入过滤器
【发布时间】:2015-07-29 02:02:43
【问题描述】:

我按照Ninject-Wiki 上的教程进行操作 这让我发疯,过滤器内的服务为空,不会更改为对象实例。我尝试了属性注入并用 [Inject] 属性装饰了界面 - 没有结果。 我尝试通过构造函数注入进行注入(如下所示) - 过滤器甚至没有被击中!我想使用这种模式:-(

看在上帝的份上(以及我的理智),请帮我解决这个问题!

最好的问候

我有一个“BaseController”,它作为我所有控制器的中心基类。它用“MyExceptionLog”-Attribute 修饰。

[MyExceptionLog]
public class BaseController : Controller
{
   //omitted for brevity
}

“MyExceptionLog”只是一个用于标记控制器的空类。它继承自 FilterAttribute。 我想要注入服务的过滤器如下所示:

public class MyExceptionLogFilter:ActionFilterAttribute
{
    private readonly ILogger Logger;
    public MyExceptionLogFilter(ILogger logger)
    {
        Logger = logger;
    }

    public override void  OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
        {
            Logger.Log(nameof(filterContext.Controller), filterContext.Exception, null);
            if (filterContext.Exception.InnerException != null)
            {
                Logger.Log(nameof(filterContext.Controller), filterContext.Exception.InnerException, null);
            }
        }
    }
}

我使用 customControllerFactory 将服务注入我的控制器:

public class NinjectControllerFactory : DefaultControllerFactory
{
    public IKernel kernel;

    public NinjectControllerFactory()
    {
        kernel = new StandardKernel();
        AddBindings(); 
    }

    private void AddBindings()
    {
        kernel.Bind<IDbRepository>().To<DbRepository>();
        kernel.Bind<ILogger>().To<EntLibLogger>();
        kernel.BindFilter<MyExceptionLogFilter>(FilterScope.Action, 0).WhenControllerHas<MyExceptionLogAttribute>();
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        return controllerType == null
            ? null
            : (IController)kernel.Get(controllerType);
    }
}

最后我在 Global.Asax.cs 中注册了 controllerFactory

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}

【问题讨论】:

标签: c# asp.net-mvc dependency-injection ninject ninject.web.mvc


【解决方案1】:

我遇到了类似的问题。我可以通过将服务注入到我的基本 api 控制器类中来解决它。

例子:

public class BaseApiController : ApiController
{
     private readonly ILogger _logger;

     public BaseApiController(ILogger logger)
     {
        _logger = logger;
     }

     protected override void Initialize(HttpControllerContext controllerContext)
      {
         _logger.log("somes stuff");
         base.Initialize(controllerContext);
      }

}

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 2019-02-26
    • 2019-04-14
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多