Autofac官方文档(十一)【使用生命周期范围】
来源:互联网 发布:顺丰淘宝合作价格表 编辑:程序博客网 时间:2024/06/05 21:06
创建一个新的生命周期范围
您可以通过在任何现有生命周期作用域上从根容器开始调用BeginLifetimeScope()
方法来创建生命周期作用域。生命周期作用域是可销毁的,他们跟踪组件的处置,所以确保你总是调用“Dispose()”
或者把它们包装在“using”
语句中。
using(var scope = container.BeginLifetimeScope()){ //从作为根容器子项的作用域来解析服务 var service = scope.Resolve<IService>(); //您也可以创建嵌套的作用域... using(var unitOfWorkScope = scope.BeginLifetimeScope()) { var anotherService = unitOfWorkScope.Resolve<IOther>(); }}
标记生命周期范围
在某些情况下,您希望跨工作单元共享服务,但您不希望像单例模式那样在全局共享这些服务。 Web应用程序中的一个常见示例是“per-request”生命周期。(您可以在“实例范围”主题中阅读有关per-request范围的更多信息。)在这种情况下,您需要标记生命周期范围并将服务注册为InstancePerMatchingLifetimeScope()
。
例如,假设您有一个发送电子邮件的组件。系统中的逻辑事务可能需要发送多个电子邮件,因此您可以在逻辑事务的各个部分之间共享该组件。 但是,您不希望电子邮件组件成为全局单例。 你的设置可能看起来像这样:
//将您的事务级共享组件注册为InstancePerMatchingLifetimeScope,并为其提供一个“已知标记”,您将在启动新事务时使用它。var builder = new ContainerBuilder();builder.RegisterType<EmailSender>() .As<IEmailSender>() .InstancePerMatchingLifetimeScope("transaction");// 订单处理器和收据管理器都需要发送电子邮件通知。builder.RegisterType<OrderProcessor>() .As<IOrderProcessor>();builder.RegisterType<ReceiptManager>() .As<IReceiptManager>();var container = builder.Build();//使用标签创建事务范围using(var transactionScope = container.BeginLifetimeScope("transaction")){ using(var orderScope = transactionScope.BeginLifetimeScope()) { //这将解析一个IEmailSender使用,但IEmailSender将“活”在父事务范围内,并由于该标记在事务范围的任何子节点之间共享。 var op = orderScope.Resolve<IOrderProcessor>(); op.ProcessOrder(); } using(var receiptScope = transactionScope.BeginLifetimeScope()) { //这也将解析一个IEmailSender使用,但它会找到父范围内的现有IEmailSender,并使用它。 这将是订单处理器使用的相同实例。 var rm = receiptScope.Resolve<IReceiptManager>(); rm.SendReceipt(); }}
同样,您可以在“实例范围”主题中阅读有关标记范围和per-request 范围的更多信息。
添加注册到生命周期范围
Autofac允许您在创建生命周期范围时“随时”添加注册。 当您需要进行某种“点焊”有限的注册覆盖时,或者您通常只需要一些您不希望在全局范围内注册的附加东西时,这可以帮助您。 通过将一个lambda传递给使用ContainerBuilder
并添加注册的BeginLifetimeScope()
来完成此操作。
using(var scope = container.BeginLifetimeScope( builder => { builder.RegisterType<Override>().As<IService>(); builder.RegisterModule<MyModule>(); })){ // 额外的注册将只在这个生命周期范围内可用。}
阅读全文
0 0
- Autofac官方文档(十一)【使用生命周期范围】
- Autofac官方文档(十二)【实例范围】
- Autofac官方文档(十五)【生命周期事件】
- Autofac官方文档(二十一)【应用集成之OWIN】
- Autofac官方文档(十)【控制作用域和生命周期】
- Autofac官方文档(一)【开始】
- Autofac官方文档(二)【新版本】
- Autofac官方文档(十四)【销毁】
- Autofac官方文档(十七)【配置】
- Autofac官方文档(十九)【模块】
- Autofac官方文档(七)【解析服务】
- Autofac官方文档(十三)【捕获依赖】
- Autofac官方文档(十八)【JSON/XML 配置】
- Autofac官方文档(二十)【应用集成】
- Autofac官方文档翻译——(一)Getting Started
- Autofac官方文档(三)【注册组件之注册概念】
- Autofac官方文档(六)【注册组件之程序集扫描】
- Autofac官方文档(十六)【在启动时运行代码】
- java基础回顾-01-什么是面向对象
- 30分钟学透设计模式1-单例模式的前世今生
- 理解自动内存管理(Automatic Memory Management)
- 使用谱方法和有限差分法根据位移求解应变
- 4. Spring Boot Security角色管理持久化实现
- Autofac官方文档(十一)【使用生命周期范围】
- 12.1-12.2数据结构专题总结·点分治·splay·LCT
- 2017年12月3日训练笔记
- 操作系统学习之路01
- js怎么获取路径后面带过来的参数?
- 高通的专利收费模式现状
- spring boot 配置fastjson解析json
- 1040. 有几个PAT
- epoll以及ET、LT模式