1、定义接口
public interface MyInterceptorInterface
2、实现接口
public class MyInterceptorImpl : MyInterceptorInterface
在构造中增加以下代码,便于观察
static ConcurrentDictionary<string, string> keyValues = new ConcurrentDictionary<string, string>();
public MyInterceptorImpl() {
keyValues.TryAdd(Guid.NewGuid().ToString(), "12");
}
3、进行ioc注入
builder.Services.AddTransient<MyInterceptorInterface, MyInterceptorImpl>();
4、接收对应的注入对象
MyInterceptorInterface myInterceptorInterface;
MyAddScoped myAddScoped;
public ValuesController(MyInterceptorInterface myInterceptor, MyAddScoped myAddScoped)
{
myInterceptorInterface = myInterceptor;
this.myAddScoped = myAddScoped;
}
ps:使用[FromServices] 注解,这样也可以在方法中直接获取到,前提是已经注入
public string TestRoute([FromServices] MyInterceptorInterface myInterceptor)
5、调用对应接口
public string TestMyInterceptorAspect([FromBody] test str)
{
//MyInterceptorInterface? myInterceptor = HttpContext.RequestServices.GetService<MyInterceptorImpl>();
this.myAddScoped.Test();
return this.myInterceptorInterface?.Test(str.str) ?? "error";
}
6、结论
1、注入有父类接收参数必须是父类,没有写父类只写子类可以用子类接收
三种方式
Scoped方式:
1、每一次web请求都会创建一个范围内存在的对象
builder.Services.AddScoped<MyInterceptorInterface, MyInterceptorImpl>();
AddSingletond方式:
1、对象只创建一次,单例模式
builder.Services.AddSingleton<MyInterceptorInterface, MyInterceptorImpl>();
AddTransient方式:
1、每次请求都创建、生命周期最短
builder.Services.AddTransient<MyInterceptorInterface, MyInterceptorImpl>();