Autofac实现依赖注入

目录

依赖注入概念

依赖注入的三种方式

Autofac还支持通过配置文件来进行服务注册


依赖注入概念

说autofac之前我们要知道什么是依赖注入和切面编程

DI---Dependency Injection,即“依赖注入”:把有依赖关系的类放到容器中,解析出这些类的实例,就是依赖注入。目的是实现类的解耦。

autofac实现依赖注入的步骤:

  1. 首先通过nuget引入autofac
  2. 创建一个 ContainerBuiler
  3. .注册接口和实现关系
  4. 通过 ContainerBuiler 的 Build 方法,得到 IContainer 容器
  5. 通过 IContainer 容器获取实例
  6. 使用服务

依赖注入的三种方式

1.构造注入

#创建接口
using Autofac.Extras.DynamicProxy;
using demo681Common.AutofacException;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace demo681.Models.inter
{
    public interface ITestServiceA
    {
        void first();
    }
}
//创建实现的关系
using Autofac.Extras.DynamicProxy;
using demo681.Models.inter;
using demo681Common;
using demo681Common.AutofacException;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace demo681.Models.real
{
  
    public class TestServiceA : ITestServiceA
    {
       
        public TestServiceA()
        {
            Console.Write("函数被构造");
        }
        public void first()
        {
            //throw new NotImplementedException();
            Console.WriteLine("这是一个ioc示例");

        }
        
}

autofac是第三方服务,可以通过工厂模式进行创建对象

在program.cs中配置工厂

 public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseServiceProviderFactory(new AutofacServiceProviderFactory());
    }

在startup.cs中添加一个方法public void ConfigureContainer(ContainerBuilder containerBuilder),这个方法能够被autofac自动调用,负责注册各种服务。

  public void ConfigureContainer(ContainerBuilder containerBuilder)
        {
 ContainerBuilder builder = new ContainerBuilder();//创建ContainerBuilder类
            builder.RegisterType<TestServiceA>().As<ITestServiceA>();//注册抽象和实现关系
            IContainer con = builder.Build();  //build.得到容器
            ITestServiceA test1 = con.Resolve<ITestServiceA>();//获取服务
            test1.first();

}

2.属性注入

//创建接口 
 public interface ITestServiceB
    {
        void first();
    }
//通过属性方式将A注入到B 
public class TestServiceB : ITestServiceB
    {
        public ITestServiceA _itestserviceA { get; set; } //属性注入
       
        public TestServiceB()
        {
            Console.Write("函数bB被构造");
        }
        public void first()
        {
            _itestserviceA.first();
            //throw new NotImplementedException();
            Console.WriteLine("这是一个iocTESTB示例");
        }
        public virtual void show()
        {
            Console.WriteLine("这个是属性注入的示例");
        }
    }
//注册服务
  public void ConfigureContainer(ContainerBuilder containerBuilder)
        {
 ContainerBuilder builder = new ContainerBuilder();//创建ContainerBuilder类
            builder.RegisterType<TestServiceA>().As<ITestServiceA>();//注册抽象和实现关系
            builder1.RegisterType<TestServiceB>().As<ITestServiceB>().PropertiesAutowired();
//指定ITestServiceB能支持属性注入
            IContainer con = builder.Build();  //build.得到容器
            ITestServiceB test1 = con.Resolve<ITestServiceB>();//获取服务
            test1.first();

}

3.方法注入

using demo681.Models.inter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace demo681.Models.real
{
    public class TestServiceB : ITestServiceB
    {
       public ITestServiceA _itestserviceA { get; set; } //属性注入
        public void setSeriveA(ITestServiceA itesta)
        {
            _itestserviceA = itesta;  //方法注入

        }
        public TestServiceB(ITestServiceA itestservicea)
        {
            itestservicea.first();
            Console.Write("实现方法注入");
            Console.WriteLine($"{this.GetType().Name}被构造");
        }
        public TestServiceB()
        {
            Console.Write("函数bB被构造");
        }
        public void first()
        { 
            Console.Write("实现属性注入");
            _itestserviceA.first();
            //throw new NotImplementedException();
            Console.WriteLine("这是一个iocTESTB示例");
        }
        public virtual void show()
        {
            Console.WriteLine("123456");
        }
    }
}
//方法注入
  public void ConfigureContainer(ContainerBuilder containerBuilder)
        {
ContainerBuilder builder1 = new ContainerBuilder();
builder1.RegisterType<TestServiceA>().As<ITestServiceA>();
builder1.RegisterType<TestServiceB>().As<ITestServiceB>().PropertiesAutowired();
//指定ITestServiceB能支持属性注入
builder1.RegisterType<TestServiceB>().As<ITestServiceB>().OnActivated(e =>
e.Instance.setSeriveA(e.Context.Resolve<ITestServiceA>())).As<ITestServiceB>();
//指定方法注入
IContainer con1 = builder1.Build();
ITestServiceB test11 = con1.Resolve<ITestServiceB>();//获取服务
test11.first();
}

Autofac还支持通过配置文件来进行服务注册

首先我们需要引入autofac.Extensions.Dependencyinjection, autofac.configuration, autofac 三个nuget包

其次创建一个配置文件

atuo.json。是一种json格式的配置文件

{

  "components": [
    {
      "type": "demo681.Models.real.TestServiceA,demo681", //实现类和程序集
      "services": [
        {
          "type": "demo681.Models.inter.ITestServiceA,demo681" //抽象类
        }
      ],
      "instanceScope": "single-instance", //生命周期
      "injectProperties": true //是否支持属性注入
    },
    {
      "type": "demo681.Models.real.TestServiceB,demo681",
      "services": [
        {
          "type": "demo681.Models.inter.ITestServiceB,demo681"
        }
      ],
      "instanceScope": "single-instance", //生命周期
      "injectProperties": true //是否支持属性注入
    }
  ]
}

步骤二:在startup.cs中配置文件的读取

 public void ConfigureServices(IServiceCollection services)
        {
  ContainerBuilder containerBuilder = new ContainerBuilder();
              {
                  IConfigurationBuilder config = new ConfigurationBuilder();
                  IConfigurationSource autofacJsonConfigSource = new JsonConfigurationSource()
                  {
                        Path = "config/autofac.json",
                       Optional = false,
                      ReloadOnChange = true,
                    };
                    config.Add(autofacJsonConfigSource);
                   ConfigurationModule module = new ConfigurationModule(config.Build());
                  containerBuilder.RegisterModule(module);
   }
               IContainer container = containerBuilder.Build();
               ITestServiceA testservice1 = container.Resolve<ITestServiceA>();
               ITestServiceB testservice2 = container.Resolve<ITestServiceB>();
               testservice1.first();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值