Singleton中的Structuremap返回多个实例
本文关键字:实例 返回 中的 Structuremap Singleton | 更新日期: 2023-09-27 18:15:05
我使用命名实例为同一个接口注册了5个派生类。所有这些类都注册为Singleton
For<IBaseInterface>().Singleton().Use<DerivedClass1>().Named("Derived1");
For<IBaseInterface>().Singleton().Use<DerivedClass2>().Named("Derived2");
For<IBaseInterface>().Singleton().Use<DerivedClass3>().Named("Derived3");
有一个静态类,它根据输入解析实例。然而,我观察到每次调用ObjectFactory。GetInstance在每次请求时返回新实例,而不是Singleton。应用程序中也没有线程
知道为什么会这样吗?
编辑:静态解析帮助器会导致任何问题吗?这就是我解析实例的方法。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
}
}
我会小心你是否正确使用了依赖注入容器。例如,你在你的帖子中显示的Resolver
类,这是作为一个简单的工厂或提供者类型吗?
当使用依赖注入时,你要确保遵循RRR模式:注册、解析和释放。注册应该发生在应用程序的组合根目录中。ASP。. Net MVC中,它通常在Global.asax
中的某个地方,例如在代码背后的Application_Start
方法中。这应该只在每次应用程序池启动时发生一次(对于IIS)。
如果你碰巧在传递容器(或一个实例化容器并执行注册和解析的对象),这是你不应该做的,那么你看到的这些"不同的实例"可能来自两个不同的容器。即使你没有传递容器本身,如果你在某个地方实例化你的容器,在每个请求之后,容器被垃圾收集并在随后的请求中重新创建,你可能会看到单例对象的"不同实例"被解析和实例化;同样,每个都来自容器的不同实例。验证这一点的一种方法是验证从容器解析的对象是否也来自同一个容器实例。
HTH .