2017-02-25 2 views
2

Ich habe ein Projekt, wo ich Caching für mehrere Schnittstellen verwenden möchte.Dependency Injection und Caching Klassen Best Practice

Was ist der beste Ansatz dafür? Ich habe zwei im Sinne:

  1. Sowohl im Cache gespeichert und nicht im Cache gespeichert Klasse wird die gleiche Schnittstelle

    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. Jede Implementierung implementieren wird seine eigene Schnittstelle (obwohl in diesem Fall wäre es im Grunde das sein gleiche nur mit anderen Namen)

    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(); 
        } 
    } 
    

Mir persönlich gefällt der erste Ansatz Mehr. Ich mag die Schnittstellenvererbung in diesem Fall nicht wirklich, und da diese beiden Klassen im Grunde die gleichen sind, nur mit etwas anderer Implementierung, habe ich das Gefühl, dass sie dieselbe Schnittstelle haben sollten.

Da es jedoch keinen "einfachen" Weg gibt, kann ich das mit Unity erreichen, ich bin mir nicht sicher, ob das wirklich der beste Ansatz ist. Grundsätzlich muss ich IFoo zu FooCached überall außer FooCached selbst auflösen, wo ich Foo brauche. (Ich weiß, wie ich das schaffen könnte, indem ich zum Beispiel die benannte Registrierung benutze und InjectionConstructor für FooCached spezifiziere, aber das ist wahrscheinlich nicht in den Rahmen dieser Frage). Die zweite ist dagegen sehr einfach einzurichten.

+0

Diese Frage ist hauptsächlich meinungsbasiert (oder genauer gesagt, sie basiert auf Anforderungen), was sie [off-topic auf StackOverflow] (http://stackoverflow.com/help/dont-ask) macht. Außerdem wird es als Abhängigkeitsinjektion falsch kategorisiert, was hier nicht zur Anwendung kommt - dies ist eine reine Designmuster-basierte Frage. Ein DI-Container ist kein Cache, obwohl er möglicherweise einen Teil seines Lifestyle-Verhaltens implementiert. – NightOwl888

+1

Sie sollten den ersten Ansatz verwenden und eine Google-Suche nach "Unity Decorator Pattern" durchführen. Sie finden mehrere Blogposts und Stackoverflow-Antworten, die zeigen, wie Sie Dekorateure mit Unity registrieren. – Steven

+0

Wenn Sie anfangen, mehrere Implementierungen für die gleiche Schnittstelle zu haben (wie in Ihrem ersten Ansatz, der der richtige ist), beginnen DI-Container in der Art IMO zu sein. Weitere Informationen finden Sie in diesem Artikel (http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/). Die Alternative ist [Pure DI] (http://blog.ploeh.dk/2014/06/10/pure-di/). –

Antwort

2

Der erste Ansatz ist eher üblich und lässt sich leicht in moderne DI-Frameworks integrieren, wie z.B. SimpleInjector (es hat RegisterDecorator Methode genau dafür). Das Muster heißt Decorator und ist sehr praktisch, da Ihre Anruferklassen sich nicht darum kümmern müssen, wo und wie die Daten herkommen, sondern alles direkt im DI-Container konfigurieren. Ich würde vorschlagen, das gleiche Muster auch ohne DI zu verwenden, es entspricht auch dem Prinzip "offen/geschlossen": Diese Klasse ist für Änderungen geschlossen, aber offen für die Erweiterung (durch Verkettung der Dekoratoren).

P.S. Ich bin nicht 100% sicher, wie dies mit Unity erreicht werden kann, aber Sie können versuchen, dort nach der Dekormuster-Implementierung zu suchen.

+0

Vielen Dank, das ist, was ich gesucht habe :) –

+0

Gern geschehen :) –