2017-02-13 2 views
0

Ich möchte also einen Dienst erstellen, der auf externe API zugreift, und ich möchte häufige Anfragen von der API in diesem Dienst zwischenspeichern, es hängt von 3 anderen Diensten ab, aber ich möchte ihm eine eigene Instanz geben Cache, MemoryDistributedCache könnte später für etwas anderes aus meinem ControllerIst es richtig aspnetcore Weg? Service & Dependency Injection

services.AddSingleton<ISomeApi, SomeApi>(provider => new SomeApi(
    Configuration.Get<Options>(), 
    new MemoryDistributedCache(new MemoryCache(new MemoryCacheOptions())), 
    provider.GetService<ILogger<SomeApi>>() 
    )); 

nun geändert werden ich die api über DI zugreifen können, es funktioniert gut, aber ich bin nicht sicher, ob seine irgendeine Art eines anti-Muster oder ob es besser Möglichkeiten, es zu tun

Ich meine, das eigentliche Problem ist die Trennung des internen Cache, Anfrage IDistributedMemory von einem Dienst w ould geben mir das gleiche Objekt, als ob ich es von einem anderen Dienst anfordern, sie müssen getrennt werden

+1

Warum muss es ein separater Cache sein? Auch nur ein Hinweis: 'GetService ()' gibt null zurück, wenn der Dienst nicht gefunden wird. Wenn Ihr Dienst den Logger wirklich benötigt, verwenden Sie 'GetRequiredService ()'. – juunas

+0

lässt sich sagen, dass ein Cache von einem Datenbanksystem unterstützt wird, der zweite Cache von einem anderen – gdpm

Antwort

1

Das klingt wie etwas, das Sie für ein Proxy oder Decorator-Muster verwenden könnten. Das grundlegende Problem besteht darin, dass Sie über einen Dienst verfügen, der Datenzugriff durchführt, und über einen anderen Dienst, der für das Zwischenspeichern der Ergebnisse des ersten Dienstes verantwortlich ist. Ich weiß, dass Sie kein Repository per se verwenden, aber dennoch sollte das CachedRepository-Muster für Ihre Bedürfnisse funktionieren. Siehe hier:

http://ardalis.com/introducing-the-cachedrepository-pattern und http://ardalis.com/building-a-cachedrepository-via-strategy-pattern

Sie Ihre gecached Implementierung schreiben können, so dass sie in der eigentlichen SomeApi Art in seinem Konstruktor, wenn Sie nicht, dass ein Teil des Designs müssen flexibel sein.