当前位置: 首页 > news >正文

掌握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你了解吗?

http://www.dtcms.com/a/294984.html

相关文章:

  • GaussDB view视图的用法
  • 分布式光伏发电项目简易故障录波装置介绍
  • [硬件电路-78]:模拟器件 - 从宏观到微观:高频信号下电路与光路的特性演变与挑战
  • Hexo - 免费搭建个人博客05 - 更新个人博客
  • GUI简介 - OpenExo
  • 回顾 Palantir:八年之旅的反思
  • ​​SBOM 软件供应链安全(转)
  • haproxy的七层代理
  • Day01_C++编程
  • Ollama(3)模型迁移和API使用
  • Modbus协议详解与c#应用
  • 重写 与 重载
  • pig cloud框架中引入websocket
  • nginx websocket 代理 断网后 再联网 不能连接
  • Windows下编译UTF8-CPP
  • 前端学习 5:DFT
  • 云效CI/CD教程(PHP项目)
  • 如何提升连带消费?从新零售“人-货-场”模型拆解
  • 220V降5V,输出100MA,为家电电器消费类产品提供电源WD5202L
  • OpenCV+Python
  • WebGIS 常用坐标系
  • 真的假的?CISP认证考试将全面推行线下机考?
  • 我考PostgreSQL中级专家证书二三事
  • ubuntu24.04 nvidia driver无效///重装驱动
  • MYOJ_8513:CSP初赛题单6:竞赛要求相关
  • Java基础夯实——泛型全解析
  • Excel导入SQLServer报错
  • 炬森精密:缓冲滑轨的创新力量,重塑家居静音与安全新体验
  • SSM框架中关于Spring MVC的技术问题
  • 智能迎宾的认知革命:Deepoc具身智能如何让机器人读懂人类微语言