我使用命名实例为同一个接口注册了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
}
}
答案 0 :(得分:1)
我会小心你正确使用Dependency Injection容器。例如,您在帖子中显示的Resolver
类是否仅仅是一种工厂或提供者?
使用依赖注入时,您需要确保并遵循RRR模式:注册,解析和发布。注册应该在您的应用程序的组合根目录中进行。对于ASP.Net MVC,它通常位于Global.asax
内,例如在代码隐藏的Application_Start
方法中。这应该只在每个应用程序池启动时发生一次(对于IIS)。
如果您正在传递容器(或实例化容器并执行注册并稍后解决的对象) - 您不应该这样做 - 您看到的这些“不同实例”可能来自两个不同的容器。即使您没有在容器周围传递,如果您要在某个地方实例化容器,在每次请求之后,容器被垃圾收集并在后续请求中重新创建,您可能会看到单例的“不同实例”正在解析和实例化的对象;再次,每个来自容器的不同实例。验证这一点的一种方法是验证从容器中解析的对象是否也来自同一个容器实例。
HTH。