生命周期
services.AddTransient<IClock, ChinaClock>(); // 瞬时生命周期
services.AddSingleton<IClock, ChinaClock>(); //单例--进程唯一实例
services.AddScoped<IClock, ChinaClock>();
//作用域单例(容器实例单例)---一个请求一个实例
对于Scoped,作用域就是CreateScope.只要是一个Scope就是相同的,下面是相同的
var contain = services.BuildServiceProvider();
{
var C1 = contain.CreateScope().ServiceProvider.GetService<IClock>();
var C2 = contain.CreateScope().ServiceProvider.GetService<IClock>();
}
注:不建议太多单例,仅适合需要单例的(配置文件,容器实例,连接池等),摒弃传统单例
大部分为瞬时的生命周期
请求单例,一个HTTp请求是一个单例,一次请求会创建一个容器
AOP
面向切面编程(Aspect Orientend Programming)
不破坏封装的前提下额外拓展功能
对于Asp.net core 3.x ,引用:
using Microsoft.AspNetCore.Mvc.Filters;
public class CustomExceptionFilterAttribute: ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
if (!context.ExceptionHandled)
{
context.Result = new JsonResult(new
{
Result = false,
Msg = ""
});
}
base.OnException(context);
}
}
[CustomExceptionFilterAttribute]
public class DepartmentController : Controller
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options=>
{
options.Filters.Add(typeof(CustomExceptionFilterAttribute));
});
action 注册
控制器注册
全局注册
Filter 的四种注册方式
- 全局注册 (同上)
- ServiceFilter
[ServiceFilter(typeof(CustomExceptionFilterAttribute))]
public class DepartmentController : Controller
//需要注册
services.AddTransient<CustomExceptionFilterAttribute>();
- TypeFilter
[TypeFilter(typeof(CustomExceptionFilterAttribute))]
- IFilterFactory
//一个属性
public class CustomFilterFactoryAttribute : Attribute, IFilterFactory
{
private Type _FilterType = null;
public CustomFilterFactoryAttribute(Type type)
{
this._FilterType = type;
}
public bool IsReusable => true;
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
//IServiceProvider 是一个容器
//IFilterMetadata 是一个空接口,是为了标识
return (IFilterMetadata)serviceProvider.GetService(this._FilterType);
}
}
//标记
[CustomFilterFactory(typeof(CustomFilterFactoryAttribute))]
//注册
services.AddTransient<CustomFilterFactoryAttribute>();
顺序是就近原则