inconsistency of RegisterInstance method and InstancePerDependency lifetime scope(RegisterInstance方法和InstancePerependency生存期范围不一致)
问题描述
我是Autofac新手,Autofac的一个API允许您提供创建为的实例(不使用反射):
var builder = new ContainerBuilder();
MyClass myClass = new MyClass();
builder.RegisterInstance<MyClass>(myClass);
但API还允许您进一步将生命周期控制为瞬变:
builder.RegisterInstance<MyClass>(myClass).InstancePerDependency();
因此,如果在子生命周期作用域中将其解析为:
IContainer container = builder.Build();
using (var childScope1 = container.BeginLifetimeScope()) {
MyClass myClass1 = childScope1.Resolve<MyClass>();
...
}
using (var childScope2 = container.BeginLifetimeScope()) {
MyClass myClass2 = childScope2.Resolve<MyClass>();
...
}
...
您将获得与您在新建实例时创建的实例相同的实例,因此您不会在每次请求时都有一个不同的MyClass
实例,这正是短暂生存期的目的。因此,将InstancePerDependency
或InstancePerLifetimeScope
方法与RegisterInstance
方法一起使用实际上没有意义,这就是我所认为的。但既然API允许这样做,那么它的真正含义是什么呢?
推荐答案
这是the second question您问过您在哪里提供重现程序,但您尚未实际运行代码。
如果您在注册和实例所在的位置运行代码,然后尝试更改其生存期范围,则会出现异常。
System.InvalidOperationException : The instance registration 'MyClass' can support SingleInstance() sharing only.
我认识到,在某些假设情况下,它似乎可以工作,因为它编译,但由于依赖项注入主要基于运行时的连接,因此有许多错误只有在构建容器并将所有内容挂钩在一起时才会被捕获。
我建议放慢速度以加快速度:与其编写假设的代码并考虑会发生什么,您可以通过设置一个仅包含Autofac和Xunit的Scratch项目来回答您自己的许多问题。编写一组很小的单元测试来验证理论或检查事情。它可以为您节省大量撰写问题的时间,这将节省我们尝试回答问题的时间,并且通过获得一些实践经验,它将使您更深入地了解事物是如何运行的。
这篇关于RegisterInstance方法和InstancePerependency生存期范围不一致的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:RegisterInstance方法和InstancePerependency生存期范围不一致


基础教程推荐
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01