netcore TypeFilte ServiceFilter 注入自定义的类

原文地址


public class MyFilter: ActionFilterAttribute
{
		private readonly ILogger<MyFilter> _logger;

		public MyFilter(ILogger<MyFilter> logger)
		{
				_logger = logger;
		}
		public override void OnActionExecuting(ActionExecutingContext context)
		{
				_logger.LogInformation("do something.....");
				base.OnActionExecuting(context);
		}
}

ServiceFilter的使用

//方法上
[ServiceFilter(typeof(MyFilter))]
public IActionResult Index()
{
		return View();
}
//初始化注入
services.AddSingleton<MyFilter>();

TypeFilter的使用

一个新的类需要一些注入

public class Employee
{
		private readonly ILogger<Employee> _logger;
		private readonly string _name;

		public Employee(ILogger<Employee>logger,string name)
		{

				_logger = logger;
				_name = name;
		}

		public void Say()
		{
				_logger.LogInformation($"My name is {_name}");
		}
}

直接使用ActivatorUtilities来构造Employee


var factory = ActivatorUtilities.CreateFactory(typeof(Employee), new Type[] {typeof(string)});
var employee = factory(_provider, new object[] {"Laosiji"}) as Employee;
employee?.Say();

TypeFilter是每次请求都会创建自定义Filter的实例的,也许有的小伙伴发现它还有别的参数,比如可以这样

[TypeFilter(typeof(MyFilter),IsReusable = true)]

IsReusable代表是否可以复用,默认值是false,设置为true的时候,可以起到类似单例的效果,但是框架并不能保证它每次都会是单例的,所以您有特殊要求,还是使用ServiceFilter比较妥当,IsReusable就不要动他了。


作者:spike

分类: Net

创作时间:2023-06-25

更新时间:2024-12-09

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1