分类 Code 下的文章

类型

.Net中Filter都是以特性的形式存在,有如下五类:

  • AuthorizationFilters
  • ReousrceFilters
  • ActionFilters
  • ExceptionFilters
  • ResultFilters

AuthorizationFilters

常做权限验证;

ReousrceFilters

常做缓存;

ActionFilters

常做模型验证、日志记录;

ExceptionFilters

异常捕获;

作用范围

只能捕获ActionFilter及ActionExecution时的报错.

例子

 OnException(ExceptionContext context)
 {
  //记录日志
 }

ResultFilters

处理返回结果。

作用范围

仅Result不为空时才能够执行,若短路器执行或管道中抛出异常,则会跳过ResultFilter.

注册

注册方式

  • 方法注册

将特性注解在方法上;

  • 类注册

将特性注解在类上;

  • 全局注册

在注册Controller时使用委托注册,如:

Builder.Service.AddController( o => o.Filter.Add<CumFilter>());

## 优先级
不同类型Filter按管道模型顺序执行,相同类型的 全局>类>方法;
也可以再注册时指定 add( int order),小的优先;

短路器

当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));
    

依赖倒置

注入方式:

  • 构造函数
  • 属性注入
  • 方法注入