2017-01-10 57 views
0

我想了解如果我需要在我的結構地圖代碼中使用.singleton()。已經有一個關於這個在stackoverflow(StructureMap singleton)的問題,但我想確定我確定使用正確的語法。答案之一意味着,如果我返回一個類型,我需要使用.singleton(),使我的代碼在這裏:Structureton singleton usage

  x.For<IApprovedProgrammesHelper>().Use<ApprovedProgrammesHelper>(); 
      x.For(typeof(ICache<>)) 
       .Use(typeof(CacheHelper<>)) 
       .Dependencies.Add(typeof(TimeSpan), Settings.Instance.HttpCacheExpiration); 

應該是這樣的:

  x.For<IApprovedProgrammesHelper>().singleton().Use<ApprovedProgrammesHelper>(); 
      x.For(typeof(ICache<>)) 
       .Singleton() 
       .Use(typeof(CacheHelper<>)) 
       .Dependencies.Add(typeof(TimeSpan), Settings.Instance.HttpCacheExpiration); 

這是正確的?還是我誤解了這應該如何工作?我不完全確定這些代碼對於代碼的影響。可能值得一提的是,使用<>語句中的類型無論如何都不遵循單例模式。

感謝您的時間提前 山姆

+0

只有你知道它是否是安全的,有*一個'CacheHelper '和'ApprovedProgrammesHelper'的實例*。如果它(或它的依賴)具有任何(可變)狀態並且不是線程安全的,那麼將它們定義爲單例可能是不明智的。沒有任何人可以爲你回答這個問題,而沒有看到這兩個類的代碼,它們的依賴關係,並且知道這段代碼運行在哪個上下文中(比如框架)。 – Steven

+0

@Steven你是對的,它讓我花了一點時間才明白,如果你知道所涉及的類/接口的細節,那麼它是唯一真的可以說單體是合適的。你的解釋有助於爲我解釋這個問題 - 使用單例不正確或不正確,它完全取決於上下文。謝謝你的幫助。 –

回答

0

您使用Singleton API是正確的,但是不知道你的代碼做什麼很難說,你是否應該使其成爲一個單例。

通過添加Singleton()方法調用,您告訴StructureMap您希望它創建一個ICache<>實例,並解析爲該實例的任何其他請求。

例如,標誌着下面的類作爲一個單身總是在日期決心和時間是相同的,在其第一次調用:只有

public class SingletonExample 
{ 

    private readonly DateTime _time; 

    public SingletonExample(){ 
     _time = DateTime.Now; 
    } 

    public DateTime GetDateTime() 
    { 
     return _time; 
    } 
} 
+0

感謝您的回答,我想我需要詳細瞭解所討論的課程,然後才能做出有關單身人士使用情況的決定。你的例子幫助我理解了在某些情況下使用singleton可能是不明智的。 –