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:
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(); } }
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.
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
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
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/). –