掌握Autofac:IOC容器实战指南
一、初识:
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)); //truetestServiceA15 = testServiceA12;
}using (var scope1 = container.BeginLifetimeScope())
{ITestServiceA testServiceA13 = scope1.Resolve<ITestServiceA>();ITestServiceA testServiceA14 = scope1.Resolve<ITestServiceA>();Console.WriteLine(object.ReferenceEquals(testServiceA13, testServiceA14)); //truetestServiceA16 = testServiceA14;
}
Console.WriteLine(object.ReferenceEquals(testServiceA15, testServiceA16));//false
往期相关文章推荐
.NET依赖注入IOC你了解吗?