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生存期范围不一致
基础教程推荐
- 禁止输入少量字符,例如'<'、'&a 2022-01-01
- 当值可以是对象或空数组时反序列化 JSON 2022-01-01
- Moq It.Is<>不匹配 2022-01-01
- WPF 模态进度窗口 2022-01-01
- .NET SerialPort DataReceived 事件未触发 2022-01-01
- C# 从 List<List<int>> 中删除重 2022-01-01
- Azure Functions:CosmosDBTrigger 未在 Visual Studio 中触发 2022-01-01
- 如果有人提交恶意软件Nuget包怎么办? 2022-01-01
- 我应该在后面的代码中直接使用 Linq To SQL 还是使 2022-01-01
- 如何使用 .Net 检查 Active Directory 服务器是否已启动并正在运行? 2022-01-01
