2

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

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);
    }
}
4

1 回答 1

4

您进行了以下注册:

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

你正在做以下解决:

_container.GetInstance<SettingsCache>();

您还没有SettingsCache明确注册,但只有ICacheManager<SettingsData>. 由于SettingsCache是一个具体的类,Simple Injector 将为您将其解析为瞬态实例。

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

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

诊断服务将警告您这种类型的错误配置

于 2013-06-20T17:23:27.947 回答