4

我有我認爲我一直在玩/學習的標準.NET MVC3存儲庫模式項目。這是非常標準的結構。NET MVC3服務定位器/依賴項解析器問題與Ninject

  • 庫項目(與下文提到的緩存架構)
  • 域模型項目
  • 服務層項目
  • MVC演示項目

我碰到的一個情景,我需要注入一個只有一個靜態構造函數的類的私有成員,這使得我的構建器注入運氣不佳。

有問題的類是使用我剛剛完成的AppFabric緩存實現的包裝。 (對於這樣的傾向,我的實現是基於 http://cgeers.wordpress.com/2010/07/04/windows-server-appfabric-caching/

從本質上講,我有:

  • 接口ICacheProvider
  • 類DefaultCacheProvider:ICacheProvider
  • 靜態類緩存(利用我有什麼執行注入)

靜態類緩存是我想要注入ICacheProvider的地方被解析爲DefaultCacheProvider。

private static readonly ICacheProvider CacheProvider; 

    static Cache() 
    { 
     //DependencyResolver.Current.GetService<ICacheProvider>(); 

     //CacheProvider = 
     // (ICacheProvider)ServiceLocator.Current 
     //       .GetInstance(typeof(ICacheProvider)); 
    } 

    public static void Add(string key, object value) 
    { 
     CacheProvider.Add(key, value); 
    } 

    public static void Add(string key, object value, TimeSpan timeout) 
    { 
     CacheProvider.Add(key, value, timeout); 
    } 

    public static object Get(string key) 
    { 
     return CacheProvider[key]; 
    } 

    public static bool Remove(string key) 
    { 
     return CacheProvider.Remove(key); 
    } 

基於關我讀過,這似乎是爲服務定位的情景,但我已經看到了它的一些非常強烈的意見(反面模式,等等等等),這和我熟悉它是低 所以我不確定可以工作的實現。

我見過的StackOverflow上的建議來設計Cache類爲標準類和注入ICacheProvider在SingletonScope

kernel.Bind<ICacheProvider>().To<DefaultCacheProvider>().InSingletonScope(); 

但我個人希望有一個靜態的包裝,易於使用。

ServiceLocator是否設置了去這裏的方法或者是否有其他顯而易見的東西我不知道?如果ServiceLocator是要走的路,是否有與Ninject配合使用? I 知道Ninject現在具有服務定位器功能,但不確定如何實現。

感謝您的任何信息。

回答

5

我認爲你的方法缺少提供依賴注入的控制反轉容器的本質。

基於關我讀過,這似乎是爲服務定位的情景,但我已經看到了它的一些非常強烈的意見(反面模式,等等等等)

很強很有高見通常包括對Singleton模式的反感,換句話說,使用靜態類來提供服務。問題在於你寫的Cache類與你引用的反模式是相同的單例模式。

使用Cache單例的代碼是什麼樣的?讓我提出一個假設。

public class SomeClass 
{ 
    public string GetSomeMetaData() 
    { 
     return Cache.Get("magicKey"); 
    } 
} 

在這種情況下,您已經抽象了IoC並通過使用Singleton來避免DI。我建議

public class SomeClass 
{ 
    private readonly ICacheProvider _cacheProvider; 

    public SomeClass(ICacheProvider cacheProvider) 
    { 
     _cacheProvider = cacheProvider; 
    } 

    public string GetSomeMetaData() 
    { 
     return _cacheProvider.Get("magicKey"); 
    } 
} 

現在ICacheProvider的消費需要,並可以更容易地適應變化ICacheProvider實現類直接發生。它具有簡化測試的額外好處。 Singleton模式幾乎不可能測試。

+0

非常好的一點。你說的話真的很有道理。感謝您理直頭腦。 – Khepri 2011-04-22 04:05:31

+0

我更新了我的博客帖子,並提到了這種方法。我同意,這是一個更好的方法。 – 2011-09-15 07:39:09