目录
依赖注入概念
说autofac之前我们要知道什么是依赖注入和切面编程
DI---Dependency Injection,即“依赖注入”:把有依赖关系的类放到容器中,解析出这些类的实例,就是依赖注入。目的是实现类的解耦。
autofac实现依赖注入的步骤:
- 首先通过nuget引入autofac包
- 创建一个 ContainerBuiler
- .注册接口和实现关系
- 通过 ContainerBuiler 的 Build 方法,得到 IContainer 容器
- 通过 IContainer 容器获取实例
- 使用服务
依赖注入的三种方式
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();
}