Autofac基本使用

名词解释:

组件(Components):容器中的基本单元,凡是注册到容器中的都叫组件(包含暴漏的服务类型、生命周期域、绑定的具象对象等等基本信息)

服务(Services)::类似于组件的暴露类型,As方法后面中的对象类型,可以有多个

生命周期作用域(LifeTimeScope)

  • 生命周期:服务实例在应用程序中存在的时间长度,从开始实例化到最后释放

  • 作用域:服务在应用程序中可以消费的地方

  • 生命周期作用域:上面的两个概念,应用中的一个工作单元

注册组件的几个方法

1、反射注册:直接指定注入的对象和暴露类型,使用RegisterType<T>或者RegisterType(typeof(T))方法

2、实例注册:使用RegisterInstance()方法

3、Lambda注册

4、泛型注册(最常用)

5、条件注册:

  • IfNotRegistered表示:如果没注册过xxx,就执行语句:

builder.RegisterType<TeacherRepository>().AsSelf().IfNotRegistered(typeof(ITeacherRepository));
  • OnlyIf表示:只有...,才会执行语句:

builder.RegisterType<TeacherService>().AsSelf().As<ITeacherService>().OnlyIf(x => x.IsRegistered(new TypedService(typeof(ITeacherRepository)))||x.IsRegistered(new TypedService(typeof(TeacherRepository))));

6、程序集批量注册,利用反射实现

7、属性注入:属性注入与构造注入不同,是将容器内对应的组件直接注入到类内的属性中去

  • 要使用这种属性注入,在注册该属性所属类的时候,需要使用PropertiesAutowired()

builder.RegisterType<TeacherService>().PropertiesAutowired();

构造注入如果当参数的对象在容器中不存在的时候,解析会报错,属性注入不会报错

暴露服务

1、As<xxx>()函数,表示以其自身为暴露类型,当没有标注暴露服务时候的默认

下面四种方法等效:

builder.RegisterType<TestService>();//不标注,默认以自身类型暴露服务
builder.RegisterType<TestService>().AsSelf();
builder.RegisterType<TestService>().As<TestService>();
builder.RegisterType<TestService>().As(typeof(TestService));

2、以实现的接口暴露服务:使用As()方法,暴露类型可以是多个

builder.RegisterType<CallLogger>().As<ILogger>().As<ICallInterceptor>().AsSelf();

生命周期作用域

Autofac的生命周期作用域

瞬时单例(Instance Per Dependency)即:每次从容器中拿出来的都是全新的对象,相当于每次new出来一个,在其他容器中被叫做“Transient”(瞬时)或者“Factory”(工厂)

注册:使用InstanPerDependency()方法标注,如果不标注则为默认

builder.RegisterType<TestService>().As<ITestService>();//默认为瞬时模式
builder.RegisterType<TestService>().As<ITestService>().InstancePerDependency();
​
​
var t1 = Container.Instance.Resolve<ITestService>();
Console.WriteLine($"t1.HashCode:{t1.GetHashCode()}");
​
var t2 = Container.Instance.Resolve<ITestService>();
Console.WriteLine($"t2.HashCode:{t2.GetHashCode()}");

结果:

全局单例(Single Instance)SingleInstance

builder.RegisterType<TestService>().As<ITestService>().SingleInstance();
​
var t1 = Container.Instance.Resolve<ITestService>();
Console.WriteLine($"t1.HashCode:{t1.GetHashCode()}");
​
var t2 = Container.Instance.Resolve<ITestService>();
Console.WriteLine($"t2.HashCode:{t2.GetHashCode()}");

结果:

域内单例(Instance Per Lifetime Scope):在每个生命周期内都是单例

builder.RegisterType<TestService>().As<ITestService>().InstancePerLifetimeScope();using (var scope1 = Container.Instance.BeginLifetimeScope()){var t1 = scope1.Resolve<ITestService>();Console.WriteLine($"t1.HashCode:{t1.GetHashCode()}");var t2 = scope1.Resolve<ITestService>();Console.WriteLine($"t2.HashCode:{t2.GetHashCode()}");}using (var scope2 = Container.Instance.BeginLifetimeScope()){var t3 = scope2.Resolve<ITestService>();Console.WriteLine($"t3.HashCode:{t3.GetHashCode()}");var t4 = scope2.Resolve<ITestService>();Console.WriteLine($"t4.HashCode:{t4.GetHashCode()}");}

结果:

匹配域内单例(Instance Per Matching Lifetime Scope):InstancePerMatchingLifetimeScope(string tagName)在tagName标签域内就是单例

builder.RegisterType<TestService>().As<ITestService>().InstancePerMatchingLifetimeScope("test1");using (var scope1 = Container.Instance.BeginLifetimeScope("test1"))
{var t1 = scope1.Resolve<ITestService>();Console.WriteLine($"t1.HashCode:{t1.GetHashCode()}");var t2 = scope1.Resolve<ITestService>();Console.WriteLine($"t2.HashCode:{t2.GetHashCode()}");
}using (var scope2 = Container.Instance.BeginLifetimeScope("test1"))
{var t3 = scope2.Resolve<ITestService>();Console.WriteLine($"t3.HashCode:{t3.GetHashCode()}");var t4 = scope2.Resolve<ITestService>();Console.WriteLine($"t4.HashCode:{t4.GetHashCode()}");
}using (var scope3 = Container.Instance.BeginLifetimeScope())
{try{var t5 = scope3.Resolve<ITestService>();Console.WriteLine($"t5.HashCode:{t5.GetHashCode()}");var t6 = scope3.Resolve<ITestService>();Console.WriteLine($"t6.HashCode:{t6.GetHashCode()}");}catch (Exception ex){        Console.WriteLine($"ex{ex.ToString()}");}
}

结果:

这里同一个tag但是不通的生命周期,哈希值也是不同的,t5和t6报异常是因为无标签的域或者不是test1标签都会异常

每次请求内单例(Instance Per Request):适用于“request”类型的应用

使用InstancePerRequest()方法标注

//使用静态字符串标记
builder.RegisterType<TestService>().InstancePerMatchingLifetimeScope(Autofac.Core.Lifetime.MatchingScopeLifetimeTags.RequestLifetimeScopeTag);
//或者直接写明字符串
builder.RegisterType<TestService>().InstancePerMatchingLifetimeScope("AutofacWebRequest");

AutoFac基本使用-笔记相关推荐

  1. 依赖注入框架Autofac学习笔记

    Autofac是一个轻量级的依赖注入框架,可以在这里面下载:http://code.google.com/p/autofac/downloads/list 要想了解什么是依赖注入,可以参考下这篇博客: ...

  2. .NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)

    07 | 用Autofac增强容器能力:引入面向切面编程(AOP)的能力 如何获取没有命名的服务呢? // 获取没有命名的服务,把 namd 去掉即可 var servicenamed = this. ...

  3. AutoFac使用笔记以及操作技巧(保姆级操作)

    背景: AutoFac是解决项目耦合的比较不错的框架.是构建大型项目上的一把利器.这里就记录一下安装以及使用的过程以及心得.方便新手尽快上手 使用过程: 1.安装: 2.引入命名空间: 3.两个部分, ...

  4. ASP.NET Core 2 学习笔记(四)依赖注入

    原文:ASP.NET Core 2 学习笔记(四)依赖注入 ASP.NET Core使用了大量的依赖注入(Dependency Injection, DI),把控制反转(Inversion Of Co ...

  5. ASP.NET MVC IOC 之AutoFac攻略

    转于:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用Aut ...

  6. 依赖注入有点_12.24 (Core管道amp;中间件amp;依赖注入+琐碎笔记)

    ​emmmm,其实本来想发服务器部署那一篇的笔记的,可奈何折腾了好多天的linux,部署还是有一小丢丢不完美(我还是想完美一些)所以,今天先把core的这篇主线给更新了. NET Core 管道机制( ...

  7. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  8. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

  9. SSAN 关系抽取 论文笔记

    20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...

最新文章

  1. 每个开发人员都应该知道的 15 个 IntelliJ IDEA 快捷方式
  2. java之spring mvc之文件上传
  3. linux将所有文件生成lst_Linux自定义repo文件
  4. 服务器通电显示黄灯,服务器内存亮黄灯
  5. php 将表情存入数据库,php + mysql 存入表情 【如何轉義emoji表情,讓它可以存入utf8的數據庫】...
  6. ZOJ 1709 Oil Deposits
  7. 罗永浩要造智能音箱;苹果承认bug;微软特制AI曝光 | 极客头条
  8. 从远程服务器拷贝文件命令,远程拷贝文件命令Scp的使用
  9. 与孩子一起学编程09章
  10. 孤尽班第四天--数据模型设计总结
  11. 计算机考研英语一历年国家线,历年考研英语国家线
  12. 基于YOLOv5和U-NET的火灾检测与分割
  13. 论文阅读:Overview of the NLPCC 2018 Shared Task: Grammatical Error Correction
  14. 设置mysql回收空闲链接_mysql 8小时空闲后连接失效的解决
  15. 学生请假管理系统(jsp+servlet)
  16. JavaScript中函数里的arguments属性
  17. SOC设计之AMBA总线-AHB总线详解
  18. python字典怎么增加元素_Python字典(dict)增加元素
  19. 如何使用谷歌调试工具检查错误
  20. iphone导出视频 无法连接到设备_iPhone 如何将原始照片导出备份到电脑?

热门文章

  1. miui系统分身测试软件,miui8系统分身
  2. kafka-topics.sh java.rmi.server.ExportException: Port already in use: 5555
  3. 树上差分的整理(点的树上差分和边的树上差分)
  4. python比java好学吗-java为什么比python快?
  5. golang办公工作流workflow js-ojus/flow包介绍——系列一
  6. android商城demo,3 分钟快速 Demo(Android)
  7. 输入关键字生成对联_对联生成器
  8. 全屏抗锯齿技术-FSAA
  9. 如何用new定义二维数据以及对应的delete
  10. gedit的安装及插件使用