2013-06-20 40 views
2

我一直在经历一些奇怪的代码问题,最后似乎已经注意到,应该扮演着单身人士,实际上并不是单身人士。这是一个缓存类,所以我最终得到了同一个缓存的多个版本。我已经按照下面的方法编写了一些测试代码,并且在我看来这应该起作用。我做错了什么,或者我偶然发现了一个错误?使用SimpleInjector获得一个单例实例,该类实现了一个泛型类型,而不是实际返回一个单例

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); 
    } 
} 
+0

+1为可执行测试用例。 – Steven

回答

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

Diagnostic Services会警告你这个this type of misconfiguration

+0

谢谢,这是诀窍! –

相关问题