6

我已经使用命名实例为同一个接口注册了 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 的每次调用都会在每个请求上返回新实例,而不是单例。应用程序中也没有线程。

知道为什么会这样吗?

编辑:

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

添加更多细节 - 该项目是 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
    }
}
4

1 回答 1

1

我会小心你正确使用依赖注入容器。例如,Resolver您在帖子中展示的类,它只是充当工厂或提供者的一种类型吗?

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

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

HTH。

于 2014-07-26T17:27:36.520 回答