RegisterInstance方法和InstancePerependency生存期范围不一致

人气:824 发布:2022-10-16 标签: dependency-injection c# autofac

问题描述

我是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实例,这正是短暂生存期的目的。因此,将InstancePerDependencyInstancePerLifetimeScope方法与RegisterInstance方法一起使用实际上没有意义,这就是我所认为的。但既然API允许这样做,那么它的真正含义是什么呢?

推荐答案

这是the second question您问过您在哪里提供重现程序,但您尚未实际运行代码。

如果您在注册和实例所在的位置运行代码,然后尝试更改其生存期范围,则会出现异常。

System.InvalidOperationException : The instance registration 'MyClass' can support SingleInstance() sharing only.

换句话说,您不能将其从实例更改为逐个依赖项实例或其他任何内容。该示例不起作用。

我认识到,在某些假设情况下,它似乎可以工作,因为它编译,但由于依赖项注入主要基于运行时的连接,因此有许多错误只有在构建容器并将所有内容挂钩在一起时才会被捕获。

我建议放慢速度以加快速度:与其编写假设的代码并考虑会发生什么,您可以通过设置一个仅包含Autofac和Xunit的Scratch项目来回答您自己的许多问题。编写一组很小的单元测试来验证理论或检查事情。它可以为您节省大量撰写问题的时间,这将节省我们尝试回答问题的时间,并且通过获得一些实践经验,它将使您更深入地了解事物是如何运行的。

721