C# 如何将ILogger传递到我的过滤器

C# 如何将ILogger传递到我的过滤器,c#,asp.net-core,asp.net-core-webapi,exceptionfilterattribute,C#,Asp.net Core,Asp.net Core Webapi,Exceptionfilterattribute,我有一个ASP.NET Web APi服务 我使用IEExceptionFilter添加了一个全局错误异常例程 要在我的StartUp.cs中注册此服务,请执行以下操作: services.AddMvc(options => { options.Filters.Add(new ErrorHandlingFilter()); }); 我的异常筛选器类是: public class ErrorHandlingFilter : ApiControllerBase, IExceptio

我有一个ASP.NET Web APi服务

我使用IEExceptionFilter添加了一个全局错误异常例程

要在我的StartUp.cs中注册此服务,请执行以下操作:

services.AddMvc(options =>
{
    options.Filters.Add(new ErrorHandlingFilter()); 
});
我的异常筛选器类是:

public class ErrorHandlingFilter : ApiControllerBase, IExceptionFilter
{
    public ErrorHandlingFilter(ILogWriter logger) : base(logger)
    {

    }


    public void OnException(ExceptionContext filterContext)
    {

        // If our exception has been handled, exit the function
        if (filterContext.ExceptionHandled)
        {
            return;
        }

        // Set our handled property to true
        filterContext.Result = new StatusCodeResult(500);
        filterContext.ExceptionHandled = true;
    }
}
但是,很明显,我在这一行得到了一个编译错误:

 options.Filters.Add(new ErrorHandlingFilter()); 
因为它希望我通过一个ILogger实例

但我在这里定义Ilogger:

// Add singleton instance to the application for the LogWriter class
services.AddSingleton<ILogWriter, LogWriter>();

// Add singleton instance to the application for the NLog Logger which is used within the LogWriter implementation
services.AddSingleton(typeof(ILogger), LogManager.GetLogger("WebApi.Host"));
//将singleton实例添加到LogWriter类的应用程序中
services.AddSingleton();
//将单例实例添加到LogWriter实现中使用的NLog记录器的应用程序中
services.AddSingleton(typeof(ILogger)、LogManager.GetLogger(“WebApi.Host”);
那么,如何将一个实例传递给我的异常过滤器而不进行重复呢


我承认这可能是一个愚蠢的问题,但它非常热,所以大脑非常疲劳。

您应该使用
add
添加过滤器,这允许我们从IoC容器中解析过滤器。这意味着您的
ILogWriter
将在使用过滤器时为您注入

services.AddMvc(options =>
{
    options.Filters.Add<ErrorHandlingFilter>(); 
});

为什么您的筛选器是从
ApiControllerBase
派生的?请尝试使用
options.Filters.Add()
而不是通过类型
options.Filters.Add(typeof(ErrorHandlingFilter));//按类型
Yeah显然,在使用
new
时,需要传递有效的构造函数参数,因此必须使用其他重载,让框架知道它应该使用IoC容器处理创建。在ASP.NET Core中有无数种方法
services.AddMvc(options =>
{
  options.Filters.Add(typeof(ErrorHandlingFilter));
});