【问题标题】:Getting a singleton instance using SimpleInjector for a class which implements a generic type, not actually returning a singleton使用 SimpleInjector 为实现泛型类型的类获取单例实例,而不是实际返回单例
【发布时间】:2013-06-17 15:52:27
【问题描述】:

我遇到了一些奇怪的代码问题,最后似乎注意到应该充当单例的东西,实际上并不是单例。这是一个缓存类,所以我最终拥有同一个缓存的多个版本。我已经按照下面的方法编写了一些测试代码,在我看来这应该可以工作。我做错了什么,还是我偶然发现了一个错误?

public class GenericClassesNotRegisteredAsSingletonTest
{
    public interface ICacheManager<T> { }

    public class SettingsData { }

    public class SettingsCache : CacheManager<SettingsData> { }

    public class CacheManager<T> : ICacheManager<T> { }

    [Test]
    public void Test()
    {
        var container = new Container();

        var registration = Lifestyle.Singleton
            .CreateRegistration(typeof(SettingsCache),
                typeof(SettingsCache), container);

        container.AddRegistration(
            typeof(ICacheManager<SettingsData>), registration);

        container.Verify();

        var cache1 = container.GetInstance<SettingsCache>();
        var cache2 = container.GetInstance<SettingsCache>();

        bool sameRef = cache1 == cache2;
        Assert.That(sameRef == true);
    }
}

【问题讨论】:

  • +1 表示可执行测试用例。

标签: c# .net dependency-injection ioc-container simple-injector


【解决方案1】:

您进行了以下注册:

_container.AddRegistration(
    serviceType: typeof(ICacheManager<SettingsData>),
    registration: registration);

你正在做以下解决:

_container.GetInstance<SettingsCache>();

您尚未明确注册SettingsCache,而仅注册了ICacheManager&lt;SettingsData&gt;。由于SettingsCache 是一个具体的类,Simple Injector 会将其解析为临时实例。

解决方案是显式注册SettingsCache 或解析ICacheManager&lt;SettingsData&gt;。您可以使用相同的Registration 实例进行第二次注册。例如:

_container.AddRegistration(
    serviceType: typeof(SettingsCache),
    registration: registration);

Diagnostic Services 将警告您有关此this type of misconfiguration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多