Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将服务注入过滤器_C#_Asp.net Mvc_Dependency Injection_Ninject_Ninject.web.mvc - Fatal编程技术网

C# 将服务注入过滤器

C# 将服务注入过滤器,c#,asp.net-mvc,dependency-injection,ninject,ninject.web.mvc,C#,Asp.net Mvc,Dependency Injection,Ninject,Ninject.web.mvc,我按照教程上的 这让我发疯,过滤器内的服务为空,不会更改为对象实例。我尝试了属性注入,并用[Inject]-属性修饰接口-没有结果。 我尝试了通过构造函数注入(如下所示)-过滤器甚至没有被击中!我想使用这种模式:-( 看在上帝的份上(和我的理智上),请帮我解决这个问题 致意 我有一个“BaseController”,它作为我所有控制器的中心基类。它用“MyExceptionLog”-属性修饰 [MyExceptionLog] public class BaseController : Contr

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

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

致意

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

[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);
    }
}

我也遇到了类似的问题,我可以通过将服务注入到我的基本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);
      }

}

不要将逻辑放在属性中;将其放在使用属性数据作为输入的适当对象中:。因此,你们建议使用IActionFilter(在我的例子中是IEExceptionFilter),而不是使用属性,在应用程序启动时将其连接起来,然后高兴吗?
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);
      }

}