
一、初识:
Autofa也是一款很流行的IOC容器:那如何使用? 第三方的IOC容器;
1.Nuget引入程序包
● Autofac
● Autofac.Configuration
● Autofac.Extensions.DependencyInjection
2.创建一个ContainerBuilder
3.注册抽象和实现关系
4.Build一下,得到IContainer容器
5.通过容器获取服务实例
6.获取服务
二、Autoafa多种注入方式:
1.构造函数注入
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>();
containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>();
IContainer container = containerBuilder.Build();
ITestServiceC testServiceC = container.Resolve<ITestServiceC>();//获取服务
testServiceC.Show();
2.属性注入
(1)全属性注入
关键字:PropertiesAutowired当前构造的实例中,所有的属性全部都要支持属性注入
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>();
containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>();
containerBuilder.RegisterType<TestServiceD>().As<ITestServiceD>().PropertiesAutowired();
IContainer container = containerBuilder.Build();
ITestServiceD testServiceD = container.Resolve<ITestServiceD>();//获取服务
testServiceD.Show();
(2)选择属性注入
[AttributeUsage(AttributeTargets.Property)]
public class SelectPropAttribute : Attribute
{
}
public class CustomPropertySelector : IPropertySelector
{
public bool InjectProperty(PropertyInfo propertyInfo, object instance)
{
var flg= propertyInfo.CustomAttributes.Any(it => it.AttributeType == typeof(SelectPropAttribute));
return flg;
}
}
对需要注入的类属性添加自定义的特性
public class TestServiceA
{
[SelectProp] //有值
public IMicrophone MicrophoneProp0 { get; set; }
}
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>()
.PropertiesAutowired(new CustomPropertySelector());
IContainer container = containerBuilder.Build();
ITestServiceD testServiceD = container.Resolve<ITestServiceD>();//获取服务
testServiceD.Show();
3.方法注入
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TestServiceA>()
.OnActivated(
e => e.Instance.SetService(e.Context.Resolve<ITestServiceA>())
)
.As<ITestServiceB>();
IContainer container = containerBuilder.Build();
ITestServiceB testServiceA = container.Resolve<ITestServiceB>();//获取服务
testServiceB.Show();
public public class TestServiceA
{
[SelectProp] //有值
public IMicrophone MicrophoneProp0 { get; set; }
public void SetService(ITestServiceA testServiceA)
{
}
}
三、Autofac生命周期
1.瞬时生命周期–每次获取实例都是全新的实例
InstancePerDependency()
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>().InstancePerDependency();
IContainer container = containerBuilder.Build();
ITestServiceA testServiceA = container.Resolve<ITestServiceA>();//获取服务
ITestServiceA testServiceA1 = container.Resolve<ITestServiceA>();//获取服务
Console.WriteLine(object.ReferenceEquals(testServiceA, testServiceA1));//false
2.单例生命周期 --一个进程中都是同一个实例
SingleInstance()
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>().SingleInstance();
IContainer container = containerBuilder.Build();
ITestServiceA testServiceA = container.Resolve<ITestServiceA>();//获取服务
ITestServiceA testServiceA1 = container.Resolve<ITestServiceA>();//获取服务
Console.WriteLine(object.ReferenceEquals(testServiceA, testServiceA1));//true
3.每个生命周期范围一个实例
InstancePerLifetimeScope();
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>().InstancePerLifetimeScope();
IContainer container = containerBuilder.Build();
ITestServiceA testServiceA15 = null;
ITestServiceA testServiceA16 = null;
using (var scope1 = container.BeginLifetimeScope())
{
ITestServiceA testServiceA11 = scope1.Resolve<ITestServiceA>();
ITestServiceA testServiceA12 = scope1.Resolve<ITestServiceA>();
Console.WriteLine(object.ReferenceEquals(testServiceA11, testServiceA12)); //true
testServiceA15 = testServiceA12;
}
using (var scope1 = container.BeginLifetimeScope())
{
ITestServiceA testServiceA13 = scope1.Resolve<ITestServiceA>();
ITestServiceA testServiceA14 = scope1.Resolve<ITestServiceA>();
Console.WriteLine(object.ReferenceEquals(testServiceA13, testServiceA14)); //true
testServiceA16 = testServiceA14;
}
Console.WriteLine(object.ReferenceEquals(testServiceA15, testServiceA16));//false
2568

被折叠的 条评论
为什么被折叠?



