管道模型初解
WebApi 接收 Request,经历管道模型后,进入MvcFilter,后传回Response。
WebApi 接收 Request,经历管道模型后,进入MvcFilter,后传回Response。
.Net中Filter都是以特性的形式存在,有如下五类:
常做权限验证;
常做缓存;
常做模型验证、日志记录;
异常捕获;
只能捕获ActionFilter及ActionExecution时的报错.
OnException(ExceptionContext context)
{
//记录日志
}
处理返回结果。
仅Result不为空时才能够执行,若短路器执行或管道中抛出异常,则会跳过ResultFilter.
将特性注解在方法上;
将特性注解在类上;
在注册Controller时使用委托注册,如:
Builder.Service.AddController( o => o.Filter.Add<CumFilter>());
## 优先级
不同类型Filter按管道模型顺序执行,相同类型的 全局>类>方法;
也可以再注册时指定 add
当Context.Result被赋值时,将会跳过后续的管线步骤,直接返回结果,这一机制叫做短路器.
在ResourceFilter中:
public class ResourceFilter : Attribute, IResourceFilter
{
private Static Dictionary< string, object > _dirCache = new Dictionary< string, object >();
public void OnResourceExecuting(esourceExecutingContext context)
{
var path = context.HttpContext.Request.Path;
_dirCache[path] = context.Result as ObjectReslut;
}
public void OnResourceExxcuted(ResourceExecutedContext context)
{
var path = context.HttpContext.Request.Path;
if( _dirCache.ContainsKey(path) )
{
context.Result = _dirCache[path] as ObjectReslut;
}
}
}
[TypeFilter(typeOf(xxxActionFilterAttribute))]
[ServiceFilter(typeOf(xxxActionFilterAttribute))] // 使用此条需在build中注册改过滤器及其需要注入的参数;
typeof(xxx).isAssignable(typeof(xxx));//两个类是否有继承/实现关系,存在开放型泛型不相等。
.Net5:
在Startup中以Parm方法的形式注入容器ContainerBuilder;
.Net6:
在注册服务时
builder.Host.UserServiceProviderFactory(New AutofacServiceProviderFactory());//以AutoFac为例。
builder.Host.ConfigureContainer(ContainerBuilder)
注册:
builder.Serivces.AddTransient< 抽象Service, XXXService>();//若注入IimplementationService,则注入参数类型应为抽象类。
注入:
-在Controller/Service构造器中将作为参数注入;
-也能在minimalApi里作为参数注入;
生命周期:
Transient
瞬时
builder.Serivces.AddTransient< Isever, sever>();
builder.Serivces.AddTransient(typeof(Isever),typeOf(sever));
Scoped
线程/作用域
类似会话。
builder.Serivces.AddScoped< Isever, sever>();
builder.Serivces.AddScoped(typeof(Isever),typeOf(sever));
Singleton
单例
可用在数据库、redis连接上。
builder.Serivces.AddSingleton< Isever, sever>();
builder.Serivces.AddSingleton(typeof(Isever),typeOf(sever));
builder.Serivces.AddSingleton<Isever>(Server sever));
注入方式: