ASP.NET Core Filter如何⽀持依赖注⼊?
参考答案:
在 ASP.NET Core 中,过滤器(Filter)可以通过依赖注入(Dependency Injection)来获取所需的服务。这主要得益于 ASP.NET Core 内置的依赖注入容器,它允许你在运行时解析依赖关系并将服务注入到你的类中。
要在过滤器中使用依赖注入,你需要遵循几个步骤:
- 定义服务接口和实现:
首先,定义你需要的服务的接口和实现。例如,你可能有一个
ILogger
接口和一个实现该接口的MyLogger
类。
public interface ILogger
{
void Log(string message);
}
public class MyLogger : ILogger
{
public void Log(string message)
{
// 实现日志记录逻辑
}
}
- 在 Startup 类中注册服务:
在
Startup.cs
文件的ConfigureServices
方法中,使用IServiceCollection
的扩展方法来注册你的服务。对于上面的ILogger
接口和MyLogger
类,你可以这样做:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<ILogger, MyLogger>(); // 注册服务为作用域生命周期
}
这里我们使用了 AddScoped
方法来注册服务,这意味着每次 HTTP 请求都会创建一个新的 MyLogger
实例。你也可以使用 AddSingleton
或 AddTransient
来控制服务的生命周期。
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
来注册 MyActionFilter
。ServiceFilter
会告诉 ASP.NET Core 使用依赖注入来创建过滤器的实例。你也可以使用 TypeFilter
或直接添加过滤器实例,但 ServiceFilter
提供了更好的依赖注入支持。
现在,每当 ASP.NET Core 创建一个 MyActionFilter
的实例时,它都会自动注入一个 ILogger
的实例,你可以在你的过滤器中使用这个实例了。