2017-02-25 3 views
2

私はいくつかのインターフェイスでキャッシュを使用するプロジェクトを持っています。依存性注入とキャッシュクラスのベストプラクティス

これにはどのような方法が最適ですか?私は心の中で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. 同じインターフェイスを実装します。各実装は(独自のインターフェイスを持っていますちょうど別の名前で同じ1)

    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を指定するのか知っていますが、おそらくこの質問の範囲外です)。一方、第2のものはセットアップが非常に簡単です。

+0

この質問は主にオピニオンベースのものであり(要点以上は要件ベース)、[StackOverflowのトピック外](http://stackoverflow.com/help/dont-ask)になります。さらに、それはここでは適用されない依存性注入として分類されていません。これは純粋にデザインパターンベースの質問です。 DIコンテナは、そのライフスタイルの振る舞いの一部を実装するために使用する可能性があるにもかかわらず、キャッシュではありません。 – NightOwl888

+1

最初のアプローチを使用して、 "Unity Decorator pattern"のGoogle検索を行う必要があります。デコレータをUnityに登録する方法を示す、いくつかのブログ記事とStackoverflowの回答があります。 – 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メソッドがあります)。このパターンはDecoratorと呼ばれ、呼び出し元のクラスはどこからどのようにデータを取得するか心配する必要はありませんが、すべてをDIコンテナに直接設定するため、非常に便利です。 DIを使わなくても同じパターンを使用することをお勧めします。これは開閉の原理にも準拠しています。このクラスは変更のために閉じられていますが、拡張子(デコレータを連鎖すること)で開きます。

P.S.私はこれをUnityでどのように実現できるかについて100%確信していませんが、そこでデコレータパターンの実装を探してみることができます。

+0

ありがとう、これは私が探していたものです:) –

+0

あなたは歓迎です:) –