asp.net 依赖注入
过滤器使您可以在请求处理管道的某些阶段执行代码。 动作过滤器是在执行动作方法之前或之后执行的过滤器。 通过使用动作过滤器,可以使动作方法更加精简,干净和可维护。
有几种可用于操作方法的过滤器,每个过滤器对应于请求处理管道的不同阶段。 您可以在我之前的文章中阅读有关动作过滤器的更多信息。 在本文中,我们将讨论如何在ASP.NET Core 3.1的动作过滤器中使用依赖项注入。
[ 同样在InfoWorld上:程序员自言自语的9个谎言 ]
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
在Visual Studio 2019中创建ASP.NET Core 3.1 MVC项目
首先,让我们在Visual Studio 2019中创建一个ASP.Net Core项目。假设系统中安装了Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.Net Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 根据您的喜好,可以选择选中“将解决方案和项目放在同一目录中”复选框。
- 单击创建。
- 在接下来显示的“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 3.1(或更高版本)。
- 选择“ Web应用程序(Model-View-Controller)”作为项目模板,以创建新的ASP.NET Core MVC应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
完成这些步骤后,应在Visual Studio 2019中创建一个新的ASP.Net Core MVC项目。我们将在以下各节中使用此项目来说明在ASP.NET Core 3.1的操作方法中使用依赖项注入。
在ASP.NET Core 3.1中使用RequestServices.GetService方法
尽管不建议这样做,但使用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);
}
在ASP.NET Core 3.1中使用ServiceFilter属性
更好的做法是利用ServiceFilter属性-可以在控制器或操作级别应用它。 这是使用此属性的语法。
[ServiceFilter(typeof(typeof YourActionFilter))]
下面我们将学习如何利用ServiceFilter属性在动作过滤器中进行依赖注入。
在ASP.NET Core 3.1中创建自定义ActionFilterAttribute类
让我们创建一个自定义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 3.1中注册自定义操作筛选器
在ASP.NET Core中,您可以轻松地将服务添加到服务容器。 依赖注入不仅是ASP.NET Core中的一等公民,而且内置了对依赖注入的支持。 因此,您可以轻松注入框架服务和应用程序服务。 您可以使用以下任何一种方法在ASP.NET Core中使用依赖项注入来添加服务。
- AddTransient
- 添加范围
- AddSingleton
您可以从我在本文前面的文章中了解有关依赖项注入以及每种方法的作用的更多信息。
接下来,您必须注册自定义过滤器,以便可以将其用作ServiceType。 以下代码段说明了如何实现此目的。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<CustomActionFilter>();
services.AddControllersWithViews();
}
在ASP.NET Core 3.1的控制器中使用自定义操作筛选器
您可以利用ServiceFilter属性在控制器或控制器的操作方法中注入依赖项。 这是使用ServiceFilter属性的语法。
[ServiceFilter(typeof(MyCustomFilter))]
下面的代码段显示了如何将自定义操作过滤器应用于名为HomeController的控制器类中的操作方法。 请注意如何使用ServiceFilter属性。
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
[ServiceFilter(typeof(CustomActionFilter))]
public IEnumerable<string> Get()
{
_logger.LogInformation("Inside HttpGet action method...");
return new string[] { "Joydip", "Michael", "Anand", "Steve" };
}
}
在ASP.NET Core 3.1中设置操作筛选器的执行顺序
您甚至可以设置动作过滤器的执行顺序。 具有较高执行顺序的动作过滤器将在执行周期的稍后执行。 动作过滤器的通常执行顺序如下:
- 全局动作过滤器的OnActionExecuting方法
- 控制器动作过滤器的OnActionExecuting方法
- 动作筛选器的OnActionExecuting方法
- 动作方式
- 动作过滤器的OnActionExecuted方法
- 控制器动作过滤器的OnActionExecuted方法
- 全局动作过滤器的OnActionExecuted方法
您可以分别设置动作过滤器的执行顺序。 下面的代码段显示了如何实现此目的。
[ServiceFilter(typeof(CustomActionFilter), Order = 2)]
public IEnumerable<string> Get()
{
_logger.LogInformation("Inside HttpGet action method...");
return new string[] { "Joydip", "Michael", "Anand", “Steve” };
}
当您执行应用程序时,您会观察到CustomActionFilter在执行全局动作过滤器之后执行。
在ASP.NET Core 3.1中使用TypeFilter属性
您还可以使用类型过滤器将依赖项注入到动作过滤器中。 ServiceFilter属性对于通过IoC(控制反转)容器解决的依赖关系很好地工作。 TypeFilter的工作方式与ServiceFilter大致相同,但不需要在服务容器中注册。 此外,类型过滤器还可以用于将其他参数传递给动作过滤器。
以下代码段说明了如何使用TypeFilter。
[TypeFilter(typeof(CustomFilter), Arguments = new object[] {"This is a string parameter"})]
[HttpGet("")]
public IEnumerable<string> Get()
{
_logger.LogInformation("Inside HttpGet action method...");
return new string[] { "Joydip", "Michael", "Anand" };
}
在ASP.NET Core 3.1中使用全局操作筛选器
您还可以通过将操作过滤器添加到IServiceCollection实例的Filters集合来全局应用过滤器,如下面给出的代码片段所示。
{
services.AddControllers(config =>
{
config.Filters.Add<CustomFilter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
}
这使您可以将过滤器应用于项目中每个控制器的每个操作方法。
依赖项注入的最大好处之一是,它使您可以构建松耦合的应用程序。 在使用控制器及其动作方法时,可能经常需要注入过滤器来修改这些动作的执行方式。 ASP.NET Core 3.1使您可以轻松做到这一点。
如何在.NET Core中执行更多操作:
- 如何在ASP.NET Core中使用内存缓存
- ASP.NET Core Web API中的高级版本控制
- 如何在ASP.NET Core中使用依赖项注入
- 如何在.NET Core中使用异步和等待
- 如何使用RestSharp使用ASP.NET Core Web API
- 如何在ASP.NET Core中使用WCF SOAP服务
- 如何提高ASP.NET Core应用程序的性能
- 在Entity Framework Core中使用InMemory提供程序进行测试
- 如何使用ASP.NET Core中的日志记录
- 如何在ASP.NET Core中使用MediatR
- 如何在.NET Core中使用System.Threading.Channels
- .NET Core中更高级的AutoMapper示例
- 如何在ASP.NET Core中使用会话状态
- 如何在ASP.NET Core中使用Nancy
- 如何在ASP.NET Core中实施速率限制
- 如何在ASP.NET Core Web API中实现全局异常处理
- 如何在ASP.NET Core中使用IHostedService
- 如何在ASP.NET Core中使用Cookie
- 如何在ASP.NET Core中使用Autofac
- 如何在ASP.NET Core MVC中上传文件
- 如何在ASP.NET Core中使用URL重写中间件
- 如何在ASP.NET Core MVC中处理空值
- 如何在ASP.NET Core中使用辅助服务
- 如何使用Elmah在ASP.NET Core中进行错误记录
- 如何在ASP.NET Core中实施运行状况检查
- 如何在ASP.NET Core中使用Glimpse
- 如何在ASP.NET Core中使用Swagger
- 如何在ASP.NET Core MVC中实现全局异常处理
- 如何在ASP.NET Core中使用条件中间件
- 如何在ASP.NET Core中使用Azure应用程序见解
- 如何在ASP.NET Core中使用NCache
- 如何从ASP.NET Core Web API返回数据
- 如何在ASP.NET Core中使用响应缓存中间件
- 如何在ASP.NET Core中使用Quartz.NET安排作业
- 如何在ASP.NET Core中启用CORS
- 如何在ASP.NET Core中使用会话存储
asp.net 依赖注入