Autofac使用 -- 1
1.添加Nuget程序包,下载并安装 Autofac
2.简单使用
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }).UseServiceProviderFactory(new AutofacServiceProviderFactory());//替换工厂
public void ConfigureContainer(ContainerBuilder builder) { // 创建Autofa容器 ContainerBuilder containerBuilder = new ContainerBuilder(); // 注册服务 containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>(); // 得到container IContainer container = containerBuilder.Build(); // 获取服务 ITestServiceA testServiceA = container.Resolve<ITestServiceA>(); // 调用 testServiceA.show(); }

3.Autofac注入方式 -- 构造函数注入

// 创建Autofa容器 ContainerBuilder containerBuilder = new ContainerBuilder(); // 注册服务 containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>(); containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>(); // 得到container IContainer container = containerBuilder.Build(); // 获取服务 ITestServiceB testServiceA = container.Resolve<ITestServiceB>(); // 调用 testServiceA.show();

4.Autofac注入方式 -- 属性注入
// 创建Autofa容器 ContainerBuilder containerBuilder = new ContainerBuilder(); // 注册服务 containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>(); containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>().PropertiesAutowired();//PropertiesAutowired()添加属性注入 // 得到container IContainer container = containerBuilder.Build(); // 获取服务 ITestServiceB testServiceA = container.Resolve<ITestServiceB>(); // 调用 testServiceA.show();


5.Autofac注入方式 -- 方法注入
// 创建Autofa容器 ContainerBuilder containerBuilder = new ContainerBuilder(); // 注册服务 containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>(); containerBuilder.RegisterType<TestServiceB>() .OnActivated(u => u.Instance.set(u.Context.Resolve<ITestServiceA>())).As<ITestServiceB>(); // 得到container IContainer container = containerBuilder.Build(); // 获取服务 ITestServiceB testServiceA = container.Resolve<ITestServiceB>(); // 调用 testServiceA.show();


6-Autofac生命周期-瞬时生命周期(默认)
瞬时生命周期:每一次获取对象都是一个全新的实例,默认的生命周期。--- InstancePerDependency()
单例声明周期:在整个进程中,对象永远都是同一个实例(SingleInstance)
每个生命周期范围一个实例:同一个生命周期范围内是同一个实例,不同的生命周期范围,实例不一样。(InstancePerLifetimeScope)
每个匹配生命周期范围一个实例 InstancePerMatchingLifetimeScope(名称)
7. Autofac支持配置文件
管理Nuget包,引入3个程序集;

新建一个配置文件【autofac.json】,记得将配置文件设置为:始终复制到目录。

{ "components": [ { "type": "AutofacNet.Server.TestServiceA,AutofacNet", // 左边为类的全名称,右边为程序集名称 "services": [ { "type": "AutofacNet.IServer.ITestServiceA,AutofacNet" } ], "instanceScope": "single-instance", // 生命周期 "injectProperties": true //属性注入 }, { "type": "AutofacNet.Server.TestServiceB,AutofacNet", "services": [ { "type": "AutofacNet.IServer.ITestServiceB,AutofacNet" } ], "instanceScope": "single-instance", "injectProperties": true } ] }
// 创建Autofa容器 ContainerBuilder containerBuilder = new ContainerBuilder(); IConfigurationBuilder configuration = new ConfigurationBuilder(); IConfigurationSource source = new JsonConfigurationSource(){ Path = "autofac.json", Optional = false, ReloadOnChange = true, }; configuration.Add(source); ConfigurationModule module = new ConfigurationModule(configuration.Build()); containerBuilder.RegisterModule(module); IContainer container = containerBuilder.Build();
Autofac支持控制器属性注入

services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
创建一个类(特性);
[AttributeUsage(AttributeTargets.Property)] public class CustomPropertyAttribute : Attribute { }
创建一个类,用来判断维度;
public class CustomPropertySelect : IPropertySelector { public bool InjectProperty(PropertyInfo propertyInfo, object instance) { return propertyInfo.CustomAttributes.Any(it => it.AttributeType == typeof(CustomPropertyAttribute)); } }
注册

builder.RegisterType<TestServiceA>().As<ITestServiceA>(); builder.RegisterType<TestServiceB>().As<ITestServiceB>().PropertiesAutowired();//PropertiesAutowired()添加属性注入 Type[] controller = typeof(Startup).Assembly .GetExportedTypes().Where(type => typeof(ControllerBase) .IsAssignableFrom(type)).ToArray(); builder.RegisterTypes(controller).PropertiesAutowired(new CustomPropertySelect());
实现


浙公网安备 33010602011771号