掌握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)); //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

往期相关文章推荐

.NET依赖注入IOC你了解吗?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code-Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值