Singleton中的结构图返回多个实例
我使用命名实例为同一个接口注册了5个派生类。 所有这些类都注册为Singleton
For().Singleton().Use().Named("Derived1"); For().Singleton().Use().Named("Derived2"); For().Singleton().Use().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("Derived1") //Similarly for other instances } }
我会小心你正确使用Dependency Injection容器。 例如,您在post中显示的Resolver
类是否只是一种工厂或提供者?
使用dependency injection时,您需要确保并遵循RRR模式:注册,解析和发布。 注册应该在您的应用程序的组合根目录中进行。 对于ASP.Net MVC,它通常位于Global.asax
,例如在代码隐藏的Application_Start
方法中。 这应该只在每个应用程序池启动时发生一次(对于IIS)。
如果您正在传递容器(或实例化容器并执行注册和稍后解决的对象) – 您不应该这样做 – 您看到的这些“不同实例”可能来自两个不同的容器。 即使您没有在容器周围传递,如果您要在某个地方实例化容器,在每次请求之后,容器被垃圾收集并在后续请求中重新创建,您可能会看到单例的“不同实例”正在解析和实例化的对象; 再次,每个来自容器的不同实例。 validation这一点的一种方法是validation从容器中解析的对象是否也来自同一容器实例。
HTH。