私はいくつかのインターフェイスでキャッシュを使用するプロジェクトを持っています。依存性注入とキャッシュクラスのベストプラクティス
これにはどのような方法が最適ですか?私は心の中で2を持っている:
この場合には、それは基本的だろうが、いずれもキャッシュされ、非キャッシュクラスは
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(); } }
同じインターフェイスを実装します。各実装は(独自のインターフェイスを持っていますちょうど別の名前で同じ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のものはセットアップが非常に簡単です。
この質問は主にオピニオンベースのものであり(要点以上は要件ベース)、[StackOverflowのトピック外](http://stackoverflow.com/help/dont-ask)になります。さらに、それはここでは適用されない依存性注入として分類されていません。これは純粋にデザインパターンベースの質問です。 DIコンテナは、そのライフスタイルの振る舞いの一部を実装するために使用する可能性があるにもかかわらず、キャッシュではありません。 – NightOwl888
最初のアプローチを使用して、 "Unity Decorator pattern"のGoogle検索を行う必要があります。デコレータをUnityに登録する方法を示す、いくつかのブログ記事とStackoverflowの回答があります。 – Steven
同じインターフェイスの複数の実装を開始すると(正しい方法である最初の方法と同じように)、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/)です。 –