.Net core ---Autofac

Autofac也是一款很流行的IOC容器  第三方容器

1.Nuget引入程序包

2.创建一个ContainerEuilder

3.注册抽象和实现关系
4.Build—下,得到IContainer容器

5.通过容器获取服务实例
6.使用服务

            ContainerBuilder containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
            IContainer container=containerBuilder.Build();
           ITestServiceA testService22=container.Resolve<ITestServiceA>();//获取服务
            testService22.show();

 
Autoafac支持多种注入方式:

1.构造函数注入

 //构造函数注入
            ContainerBuilder containerBuilder = new ContainerBuilder();
             //注册抽象和实现关系
            containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
             containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>();
             IContainer container = containerBuilder.Build();
             ITestServiceB testServiceB = container.Resolve<ITestServiceB>();//获取服务
             testServiceB.show();

2.属性注入


                ContainerBuilder containerBuilder = new ContainerBuilder();
               ///注册抽象和实现关系
                containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
                containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>();
                containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>()
.PropertiesAutowired();
                IContainer container = containerBuilder.Build();
                ITestServiceC testServiceC = container.Resolve<ITestServiceC>();//获取服务
                testServiceC.show();

TestServiceC

  public  class TestServiceC :ITestServiceC
    {
        public ITestServiceA _itestServiceA { get; set; }
        public ITestServiceB _itestServiceB { get; set; }
        public TestServiceC()
        {
            Console.WriteLine($"{this.GetType().Name}被构造");
        }

        public void show()
        {
            _itestServiceA.show();
            _itestServiceB.show();
            Console.WriteLine("TestServiceC");
        }
    }

3.方法注入
                ContainerBuilder containerBuilder = new ContainerBuilder();
                //注册抽象和实现关系
                containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
                //containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>();
                //e---TestServiceB
                containerBuilder.RegisterType<TestServiceB>()
.OnActivated(e =>e.Instance.SetService(e.Context.Resolve<ITestServiceA>())).As<ITestServiceB>();
                containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>().PropertiesAutowired();
                IContainer container = containerBuilder.Build();
                ITestServiceB testServiceB = container.Resolve<ITestServiceB>();//获取服务
                testServiceB.show();

TestServiceB

 public class TestServiceB : ITestServiceB
    {
        public ITestServiceA _itestServiceA = null;
        public void SetService(ITestServiceA testServiceA)
        {
            _itestServiceA = testServiceA;
        }
        public TestServiceB( ITestServiceA itestServiceA)
        {
            Console.WriteLine($"{this.GetType().Name}被构造");
        }

        public void show()
        {
            _itestServiceA.show();
            Console.WriteLine("TestServiceB");
        }
    }

Autofac生命周期

瞬时生命周期:每次获取实例都是全新的实例 .InstancePerDependency();

//瞬时生命周期:每次获取实例都是全新的实例<默认的生命周期>
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    //注册抽象和实现关系
                    containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>()
.InstancePerDependency();
                     IContainer container = containerBuilder.Build();
                    ITestServiceA testServiceA1 = container.Resolve<ITestServiceA>();//获取服务
                    ITestServiceA testServiceA2 = container.Resolve<ITestServiceA>();//获取服务
                    Console.WriteLine(object.ReferenceEquals(testServiceA1, testServiceA2));

单例生命周期:一个进程中没有都是同一个实例 SingleInstance()

//单例生命周期---在整个进程中,对象永远都是同一个实例
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    //注册抽象和实现关系
                    containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>()
.SingleInstance();
                    IContainer container = containerBuilder.Build();
                    ITestServiceA testServiceA1 = container.Resolve<ITestServiceA>();//获取服务
                    ITestServiceA testServiceA2 = container.Resolve<ITestServiceA>();//获取服务
                    Console.WriteLine(object.ReferenceEquals(testServiceA1, testServiceA2));

每个生命周期范围一个实例 .InstancePerLifetimeScope()

 //每个生命周期范围一个实例 同一个生命周期范围内是同一个实例,不同的生命周期范围,实例不一样
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    //注册抽象和实现关系
                    containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>()
.InstancePerLifetimeScope();
                    IContainer container = containerBuilder.Build();

                    ITestServiceA testServiceA3 = null;
                    ITestServiceA testServiceA4 = null;

                    using (var scope1 = container.BeginLifetimeScope())//生命周期范围
                    {
                        ITestServiceA testServiceA11 = scope1.Resolve<ITestServiceA>();//获取服务
                        ITestServiceA testServiceA12 = scope1.Resolve<ITestServiceA>();//获取服务
                        Console.WriteLine(object.ReferenceEquals(testServiceA11, testServiceA12));
                        testServiceA3 = testServiceA11;
                    }

                    using (var scope1 = container.BeginLifetimeScope())
                    {
                        ITestServiceA testServiceA13 = scope1.Resolve<ITestServiceA>();//获取服务
                        ITestServiceA testServiceA14 = scope1.Resolve<ITestServiceA>();//获取服务
                        Console.WriteLine(object.ReferenceEquals(testServiceA13, testServiceA14));
                        testServiceA4 = testServiceA13;
                    }

                    Console.WriteLine(object.ReferenceEquals(testServiceA3, testServiceA4));

每个【匹配生命周期范围一个实例】InstancePerMatchingLifetimeScope(名称)

//每个【匹配生命周期范围一个实例】InstancePerMatchingLifetimeScope(名称)
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    //注册抽象和实现关系
                    containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>()
                   
    .InstancePerMatchingLifetimeScope("hello");
                    IContainer container = containerBuilder.Build();

                    ITestServiceA testServiceA3 = null;
                    ITestServiceA testServiceA4 = null;

                    using (var scope1 = container.BeginLifetimeScope("hello"))//生命周期范围
                    {
                        ITestServiceA testServiceA11 = scope1.Resolve<ITestServiceA>();//获取服务
                        using (var scope2 = scope1.BeginLifetimeScope())//生命周期范围
                        {
                            ITestServiceA testServiceA12 = scope2.Resolve<ITestServiceA>();
                            Console.WriteLine(object.ReferenceEquals(testServiceA11, testServiceA12));
                        }
                      testServiceA3 = testServiceA11;
                    }
                    using (var scope1 = container.BeginLifetimeScope("hello"))//生命周期范围
                    {
                        ITestServiceA testServiceA13 = scope1.Resolve<ITestServiceA>();//获取服务
                        using (var scope2 = scope1.BeginLifetimeScope())//生命周期范围
                        {
                            ITestServiceA testServiceA14 = scope2.Resolve<ITestServiceA>();
                            Console.WriteLine(object.ReferenceEquals(testServiceA13, testServiceA14));
                        }
                        testServiceA4 = testServiceA13;
                    }

                    Console.WriteLine(object.ReferenceEquals(testServiceA3,testServiceA4));
                }

//每个请求一个实例(InstancePerRequest)
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    //注册抽象和实现关系
                    containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>()
                        .InstancePerRequest();

Autofac支持配置文件

1 .Nuget引入程序集:

  Autofac.Extensions.DependencyInjection
  Autofac.Configuration
  Autofac
2 .准备配置文件

建一个文件夹

autofac.json

{
  "components": [
    {
      "type": "
Services.TestServiceA,Services",//Services.TestServiceA在左边,Services在右边
      "services": [
        {
          "type": "Interface.ITestServiceA,Interface"
        }
      ],
      "instanceScope": "single-instance", //生命周期
      "injectProperties": true //属性注入
    },
    {
      "type": "Services.TestServiceB,Services",
      "services": [
        {
          "type": "Interface.ITestServiceB,Interface"
        }
      ],
      "instanceScope": "single-instance", //生命周期
      "injectProperties": true //属性注入
    },
    {
      "type": "Services.TestServiceC,Services",
      "services": [
        {
          "type": "Interface.ITestServiceC,Interface"
        }
      ],
      "instanceScope": "single-instance", //生命周期
      "injectProperties": true //属性注入
    }
  ]
}

3 .读取配置文件,根据配置文件信息,生成抽象和映射信息

    ContainerBuilder containerBuilder = new ContainerBuilder();
                {
                    //读取配置文件,把配置关系装载到ContainerBuilder
                    IConfigurationBuilder config = new ConfigurationBuilder();
                    IConfigurationSource configurationSource = new JsonConfigurationSource()
                    {
                        Path = "CfgFile/autofac.json",
                        Optional = false,//boolean 默认就是false ,可以不写
                        ReloadOnChange = true,//同上
                    };
                    config.Add(configurationSource);
                    ConfigurationModule module = new ConfigurationModule(config.Build());
                    containerBuilder.RegisterModule(module);
                   
                }
                    IContainer container = containerBuilder.Build();
                    ITestServiceA testServiceA = container.Resolve<ITestServiceA>();
                    ITestServiceC testServiceC = container.Resolve<ITestServiceC>();
                    testServiceC.show();

            }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值