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