跳到主要内容

ASP.NET Core Filter如何⽀持依赖注⼊?

参考答案:

在 ASP.NET Core 中,过滤器(Filter)可以通过依赖注入(Dependency Injection)来获取所需的服务。这主要得益于 ASP.NET Core 内置的依赖注入容器,它允许你在运行时解析依赖关系并将服务注入到你的类中。

要在过滤器中使用依赖注入,你需要遵循几个步骤:

  1. 定义服务接口和实现: 首先,定义你需要的服务的接口和实现。例如,你可能有一个 ILogger 接口和一个实现该接口的 MyLogger 类。
public interface ILogger
{
    void Log(string message);
}

public class MyLogger : ILogger
{
    public void Log(string message)
    {
        // 实现日志记录逻辑
    }
}
  1. 在 Startup 类中注册服务: 在 Startup.cs 文件的 ConfigureServices 方法中,使用 IServiceCollection 的扩展方法来注册你的服务。对于上面的 ILogger 接口和 MyLogger 类,你可以这样做:
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddScoped<ILogger, MyLogger>(); // 注册服务为作用域生命周期
}

这里我们使用了 AddScoped 方法来注册服务,这意味着每次 HTTP 请求都会创建一个新的 MyLogger 实例。你也可以使用 AddSingletonAddTransient 来控制服务的生命周期。 3. 在过滤器中使用依赖注入: 现在,你可以在你的过滤器中使用依赖注入了。假设你有一个名为 MyActionFilter 的动作过滤器,它依赖于 ILogger 服务:

public class MyActionFilter : IActionFilter
{
    private readonly ILogger _logger;

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

    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 在动作执行前使用 _logger
        _logger.Log("Action is executing");
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 在动作执行后使用 _logger
        _logger.Log("Action has executed");
    }
}

在这个例子中,MyActionFilter 的构造函数接受一个 ILogger 参数,ASP.NET Core 的依赖注入容器会自动提供这个参数的一个实例。 4. 注册过滤器: 最后,你需要在 Startup.cs 文件中注册你的过滤器。对于动作过滤器,你可以这样做:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.Filters.Add(new ServiceFilter<MyActionFilter>()); // 注册过滤器
    });
    services.AddScoped<ILogger, MyLogger>();
}

这里我们使用了 ServiceFilter 来注册 MyActionFilterServiceFilter 会告诉 ASP.NET Core 使用依赖注入来创建过滤器的实例。你也可以使用 TypeFilter 或直接添加过滤器实例,但 ServiceFilter 提供了更好的依赖注入支持。

现在,每当 ASP.NET Core 创建一个 MyActionFilter 的实例时,它都会自动注入一个 ILogger 的实例,你可以在你的过滤器中使用这个实例了。