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

 

 实现

 

posted @ 2021-04-30 14:59  顾小凡  阅读(162)  评论(0)    收藏  举报