2013-06-20 37 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

謝謝,這是訣竅! –

相關問題