2017-02-25 55 views
2

我有一個項目,我想使用緩存幾個接口。依賴注入和緩存類最佳實踐

這是最好的方法是什麼?我有兩個考慮:

  1. 兩個緩存和非緩存類將實現相同的接口

    public interface IFoo 
    { 
        object Get(); 
    } 
    
    public class Foo : IFoo 
    { 
        public object Get() 
        { 
         // return something from datasource 
         return null; 
        } 
    } 
    
    public class FooCached : IFoo 
    { 
        private readonly IFoo fooService; 
    
        public FooCached(IFoo fooService) 
        { 
         this.fooService = fooService; 
        } 
    
        public object Get() 
        { 
         // check cache and if empty load the value using fooService (Foo class) 
         return this.fooService.Get(); 
        } 
    } 
    
  2. 每個實施將有自己的接口(儘管在這種情況下,它基本上是同一個只是用不同的名字)

    public interface IFoo 
    { 
        object Get(); 
    } 
    
    public interface IFooCached : IFoo 
    { 
    } 
    
    public class Foo : IFoo 
    { 
        public object Get() 
        { 
         // return something from datasource 
         return null; 
        } 
    } 
    
    public class FooCached : IFooCached 
    { 
        private readonly IFoo fooService; 
    
        public FooCached(IFoo fooService) 
        { 
         this.fooService = fooService; 
        } 
    
        public object Get() 
        { 
         // check cache and if empty load the value using fooService (Foo class) 
         return this.fooService.Get(); 
        } 
    } 
    

我個人比較喜歡第一種方法更多。在這種情況下,我不太喜歡接口繼承,並且由於這兩個類基本上是相同的,只是稍微有點不同,我覺得他們應該有相同的接口。

但是,由於沒有「簡單」的方法,我可以看到使用Unity來實現這一點,我不確定這是否是最好的方法。 基本上我需要將IFoo解析爲FooCached,除了FooCached本身,我需要Foo。 (我知道我是如何完成這項工作的,例如使用命名註冊和爲FooCached指定InjectionConstructor,但這可能不在此問題的範圍之內)。另一方面,第二個是非常容易安裝的。

+0

這個問題主要是基於意見的(或者更多關於點,它是基於需求的),這使得它[在StackOverflow上脫離主題](http://stackoverflow.com/help/dont-ask)。此外,它被歸類爲依賴注入,這不適用於此 - 這是一個純粹的基於設計模式的問題。 DI容器不是緩存,儘管它可能使用一個實現其生活方式行爲。 – NightOwl888

+1

你應該使用第一種方法,並進行谷歌搜索「Unity裝飾模式」。你會發現幾個博客文章和Stackoverflow的答案,展示瞭如何向Unity註冊裝飾器。 – Steven

+0

當你開始爲同一界面開發多個實現時(如你的第一種方法是正確的),DI容器開始成爲IMO的方式。有關更多詳細信息,請參閱[本文](http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/。)。另一種選擇是[Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)。 –

回答

2

第一種方法比較常見,可以很容易地與現代DI框架集成在一起,例如, SimpleInjector(它有RegisterDecorator方法正是爲此)。該模式稱爲裝飾器,因爲您的呼叫者類無需擔心數據來自何處和如何,所以您可以直接在DI容器中配置所有內容。我建議使用相同的模式,即使沒有DI,它也遵循開放/封閉的原則:這個類是關閉的修改,但打開擴展(通過鏈接裝飾)。

P.S.我不能100%確定Unity如何實現這一點,但您可以嘗試在那裏搜索裝飾器模式實現。

+0

謝謝大家,這就是我一直在尋找:) –

+0

歡迎:) –