asp.net 依赖注入
过滤器使您可以在请求处理管道的某些阶段执行代码。 动作过滤器是在执行动作方法之前或之后执行的过滤器。 通过使用动作过滤器,可以使动作方法更加精简,干净和可维护。
有几种可用于操作方法的过滤器,每个过滤器对应于请求处理管道的不同阶段。 您可以在我之前的文章中阅读有关动作过滤器的更多信息。 在本文中,我们将讨论如何在ASP.NET Core 3.1的动作过滤器中使用依赖项注入。
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
首先,让我们在Visual Studio 2019中创建一个ASP.Net Core项目。假设系统中安装了Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.Net Core项目。
完成这些步骤后,应在Visual Studio 2019中创建一个新的ASP.Net Core MVC项目。我们将在以下各节中使用此项目来说明在ASP.NET Core 3.1的操作方法中使用依赖项注入。
尽管不建议这样做,但使用RequestServices.GetService方法是检索已添加到服务集合的服务的简单方法。 假设已将名为CustomService的服务添加到服务容器,则可以使用以下代码检索服务实例。
public override void OnActionExecuting(ActionExecutingContext context)
{
var customService = context.HttpContext.RequestServices.
GetService(typeof(CustomService));
//Write your code here
_logger.LogWarning("Inside OnActionExecuting method...");
base.OnActionExecuting(context);
}
更好的做法是利用ServiceFilter属性-可以在控制器或操作级别应用它。 这是使用此属性的语法。
[ServiceFilter(typeof(typeof YourActionFilter))]
下面我们将学习如何利用ServiceFilter属性在动作过滤器中进行依赖注入。
让我们创建一个自定义ActionFilterAttribute类,并将其用作ServiceFilter。 若要在ASP.NET Core 3.1中创建自定义操作筛选器,应创建一个扩展ActionFilterAttribute类的类,如下面给出的代码片段所示。 请注意,ActionFilterAttribute类实现了IActionFilter,IAsyncActionFilter,IResultFilter,IAsyncResultFilter和IOrderedFilter接口。
public class CustomActionFilter : ActionFilterAttribute
{
private readonly ILogger _logger;
public CustomActionFilter(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("CustomActionFilter");
}
public override void OnActionExecuting(ActionExecutingContext context)
{
_logger.LogWarning("Inside OnActionExecuting method...");
base.OnActionExecuting(context);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
_logger.LogWarning("Inside OnActionExecuted method...");
base.OnActionExecuted(context);
}
public override void OnResultExecuting(ResultExecutingContext context)
{
_logger.LogWarning("Inside OnResultExecuting method...");
base.OnResultExecuting(context);
}
public override void OnResultExecuted(ResultExecutedContext context)
{
_logger.LogWarning("Inside OnResultExecuted method...");
base.OnResultExecuted(context);
}
}
在ASP.NET Core中,您可以轻松地将服务添加到服务容器。 依赖注入不仅是ASP.NET Core中的一等公民,而且内置了对依赖注入的支持。 因此,您可以轻松注入框架服务和应用程序服务。 您可以使用以下任何一种方法在ASP.NET Core中使用依赖项注入来添加服务。
您可以从我在本文前面的文章中了解有关依赖项注入以及每种方法的作用的更多信息。
接下来,您必须注册自定义过滤器,以便可以将其用作ServiceType。 以下代码段说明了如何实现此目的。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped();
services.AddControllersWithViews();
}
您可以利用ServiceFilter属性在控制器或控制器的操作方法中注入依赖项。 这是使用ServiceFilter属性的语法。
[ServiceFilter(typeof(MyCustomFilter))]
下面的代码段显示了如何将自定义操作过滤器应用于名为HomeController的控制器类中的操作方法。 请注意如何使用ServiceFilter属性。
public class HomeController : Controller
{
private readonly ILogger _logger;
public HomeController(ILogger logger)
{
_logger = logger;
}
[ServiceFilter(typeof(CustomActionFilter))]
public IEnumerable Get()
{
_logger.LogInformation("Inside HttpGet action method...");
return new string[] { "Joydip", "Michael", "Anand", "Steve" };
}
}
您甚至可以设置动作过滤器的执行顺序。 具有较高执行顺序的动作过滤器将在执行周期的稍后执行。 动作过滤器的通常执行顺序如下:
您可以分别设置动作过滤器的执行顺序。 下面的代码段显示了如何实现此目的。
[ServiceFilter(typeof(CustomActionFilter), Order = 2)]
public IEnumerable Get()
{
_logger.LogInformation("Inside HttpGet action method...");
return new string[] { "Joydip", "Michael", "Anand", “Steve” };
}
当您执行应用程序时,您会观察到CustomActionFilter在执行全局动作过滤器之后执行。
您还可以使用类型过滤器将依赖项注入到动作过滤器中。 ServiceFilter属性对于通过IoC(控制反转)容器解决的依赖关系很好地工作。 TypeFilter的工作方式与ServiceFilter大致相同,但不需要在服务容器中注册。 此外,类型过滤器还可以用于将其他参数传递给动作过滤器。
以下代码段说明了如何使用TypeFilter。
[TypeFilter(typeof(CustomFilter), Arguments = new object[] {"This is a string parameter"})]
[HttpGet("")]
public IEnumerable Get()
{
_logger.LogInformation("Inside HttpGet action method...");
return new string[] { "Joydip", "Michael", "Anand" };
}
您还可以通过将操作过滤器添加到IServiceCollection实例的Filters集合来全局应用过滤器,如下面给出的代码片段所示。
{
services.AddControllers(config =>
{
config.Filters.Add();
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
}
这使您可以将过滤器应用于项目中每个控制器的每个操作方法。
依赖项注入的最大好处之一是,它使您可以构建松耦合的应用程序。 在使用控制器及其动作方法时,可能经常需要注入过滤器来修改这些动作的执行方式。 ASP.NET Core 3.1使您可以轻松做到这一点。
翻译自: https://www.infoworld.com/article/3544006/how-to-use-dependency-injection-in-action-filters-in-aspnet-core-31.html
asp.net 依赖注入