gpt4 book ai didi

c# - Singleton 中的结构图返回多个实例

转载 作者:太空狗 更新时间:2023-10-29 21:58:21 25 4
gpt4 key购买 nike

我已经使用命名实例为同一个接口(interface)注册了 5 个派生类。所有这些类都注册为单例

For<IBaseInterface>().Singleton().Use<DerivedClass1>().Named("Derived1");
For<IBaseInterface>().Singleton().Use<DerivedClass2>().Named("Derived2");
For<IBaseInterface>().Singleton().Use<DerivedClass3>().Named("Derived3");

有一个静态类根据输入解析实例。但是我观察到,每次调用 ObjectFactory.GetInstance 都会在每个请求上返回新实例,而不是单例。应用程序中也没有线程。

知道为什么会这样吗?

编辑:

静态解析助手会导致任何问题吗?这就是我解决实例的方式。 Singleton 在示例应用程序中工作正常,但在我的机器上不工作。

要添加更多详细信息 - 该项目是 MVC Web API,我正在本地 IIS 上进行测试。我确定应用程序中没有用户创建的线程。

public static class Resolver
{
public static IBaseInterface GetHelper(string inputParam)
{
if inputParam is "Case1"
return ObjectFactory.GetInstance<IBaseInterface>("Derived1")
//Similarly for other instances
}
}

最佳答案

我会小心确保您正确使用依赖注入(inject)容器。例如,您在帖子中显示的 Resolver 类,它只是充当一种工厂还是提供者?

在使用依赖注入(inject)时,您需要确定并遵循 RRR 模式:注册、解析和发布。注册应该在您的应用程序的组合根中进行。对于 ASP.Net MVC,它通常位于 Global.asax 中的某个位置,例如在代码隐藏的 Application_Start 方法中。这应该只在每次应用程序池启动时发生一次(对于 IIS)。

如果您偶然传递容器(或实例化容器并执行注册和后续解析的对象)——您不应该这样做——您看到的这些“不同实例”可能来自两个不同的容器。即使您没有传递容器本身,如果您在某处实例化您的容器,以便在每次请求之后容器被垃圾收集并在后续请求中重新创建,您可能会看到单例的“不同实例”正在解析和实例化的对象;同样,每个都来自容器的不同实例。验证这一点的一种方法是验证从容器解析的对象是否也来自同一容器实例。

HTH.

关于c# - Singleton 中的结构图返回多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16732401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com