(一).net core依赖注入
依赖注入的原理是什么,好处是什么
1:让容器去实例化对象,不用我们手动去类里面去实例化对象,降低代码的耦合度
2:依赖注入的方式:
一种是每次请求,获取到的都是同一个实例(core自带容器相当于AddSingleton注入方式;autafac里面相当于SingleInstance注入方式)
一种是每次请求,获取一个实例获取多次,每次获取到的都是同一个实例,第二次请求获取到的就是另一个实例了(core自带容器相当于AddScoped注入方式;autafac里面相当于InstancePerLifetimeScope注入方式)
一种是每次请求,获取一个实例获取多次,每次都获取到的都是不同实例(core自带容器相当于AddTransient注入方式;autafac里面相当于InstancePerDependency注入方式)
3:获取实例的方式:
一种是构造方法获取,
一种是反射获取(快捷获取实例,不用在构造方法获取;在静态类里面没有构造方法,呢时候只能通过反射获取,因为在静态类里面不能去创建构造方法)
4:autafac在.net core中的运用方式
(1)在nuget引用Autofac,Autofac.Extensions.DependencyInjecti
(2)在program.cs里面的CreateHostBuilder方法末尾加 .UseServiceProviderFactory(new AutofacServiceProviderFactory()),表示启用autofac
(3)在Startup.cs里面增加注入的方法(ConfigureContainer呢个方法名称是固定的,不能变)
public void ConfigureContainer(ContainerBuilder builder)
{
Services.AddModule(builder, Configuration);
}
(4)注入逻辑
(1)获取项目所有依赖的程序集,
(2)排除所有的系统程序集和nuget下载包
(3)新建一个类,作为注入类的标识,必须要继承这个类的子类才会被注入,这是最方便控制的一种方式
public static IServiceCollection AddModule(this IServiceCollection services, ContainerBuilder builder, IConfiguration configuration)
{
Type baseType = typeof(IDependency);//注入类的父类标识,只有继承了这个类的子类才会被注入
var compilationLibrary = DependencyContext.Default.CompileLibraries.Where(s=>!s.Serviceable && s.Type == "project").ToList();//排除所有的系统程序集和nuget下载包
List
foreach (var item in compilationLibrary)
{
try
{
assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(item.Name)));
}
catch (Exception ex)
{
string msg=item.Name + ex.Message;//可以把异常记入log日志
}
}
//AsSelf():类没有继承于接口,类本身;AsImplementedInterfaces():是以接口的形式注册服务,也就是说,通过这种方式注册,那么被注册的类必须要继承于至少一个接口
//InstancePerLifetimeScope相当于在每次HTTP请求中只获取到一个实例;SingleInstance:单例模式,每次请求获取到的都是同一个实例;InstancePerDependency:每次请求,获取多次,会实例化多次(生命周期)
builder.RegisterAssemblyTypes(assemblyList.ToArray()).Where(type=>baseType.IsAssignableFrom(type) && !type.IsAbstract)//注册所有继承IDependency接口的类并且非抽象类
.AsSelf().AsImplementedInterfaces().InstancePerLifetimeScope();
//对具体类的注入
builder.RegisterType
//对具体接口的注入
builder.RegisterType