Benutzer mit den meisten Antworten
Dependency Injection, Wo hole ich das Objekt her?

Frage
-
Hallo,
ich will von meiner App (.NET Core 2.0) Daten in eine Oracle DB schreiben. Da es viele Daten sind möchte ich IMemoryCache benutzen. Dort heißt es, ich soll IMemoryCache über den Konstruktor entgegennehmen.
public MyClass( IMemoryCache memoryCache ) { ... }
Nun handelt es sich bei meiner Klasse nicht um einen Controller wie in dem Beispiel von Microsoft, sondern um eine Klasse, die von einer anderen aufgerufen wird.
var mc = new MyClass( ??? );
Was muss ich dort übergeben? Dort kann ich aber kein IMemoryCache -Objekt erzeugen und übergeben, weil es keine Objekte von Interfaces gibt.
Wie gehe ich mit der DI hier um?
Herzliche Grüße und danke für Unterstützung!
Frank
- Bearbeitet frank me Dienstag, 26. März 2019 08:45
Antworten
-
Hallo Frank,
Du kannst hierfür bspw. in Startup -> ConfigureServices folgendes einfügen:
services.AddMemoryCache();
und in deiner Klasse dann ggfs. noch:
using Microsoft.Extensions.Caching.Memory;
hinzufügen, falls IMemoryCache noch nicht erkannt wird.
Wenn Du die Instanz deiner Klasse manuell erzeugen willst, dann bspw. so:
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions()); ... MyClass x = new MyClass( new MemoryCache( new MemoryCacheOptions() ) );
Sinnvoller wäre es aber ggfs., auch deine Klasse über DI bereitzustellen. Bspw.:
services.AddScoped<IMyClassInterface, MyClass>();
und dann dort, wo Du es brauchst, im Konstruktor nur noch:
IMyClassInterface _myClassInstance; public MyOtherClass( IMyClassInterface myClassInstance ) { ... _myClassInstance = myClassInstance; }
anzugeben. Bzgl. Caching schau ggfs. auch mal hier:
Cache in-memory in ASP.NET Core
Zu den Unterschieden bzgl. Lebensdauer der Objekte in DI (Scoped, Transient, ...) schau mal hier:
Dependency Injection in ASP.NET Core -> Dienstlebensdauer
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport
- Bearbeitet Stefan FalzModerator Dienstag, 26. März 2019 09:12
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 29. März 2019 06:23
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 5. April 2019 09:59
-
Geholfen hat mir ein Dependency Injection Container / -Service.
Der Aufruf startet in einer CLI-Anwendung. Dort ist die Main statisch, daher kann ich schlecht was injizieren.
Nun sieht es so aus:
public static void Main(string[] args) { ServiceProvider diServiceProvider = new ServiceCollection() .AddSingleton<IMemoryCache, MemoryCache> () .BuildServiceProvider(); IMemoryCache memoryCache = diServiceProvider.GetService<IMemoryCache>();
Nun steht mir memoryCache zur Verfügung und ich kann es weitergeben nach new MyClass( memoryCache );
Geholfen hat mir vor allem dieser Link:
using-dependency-injection-in-a-net-core-console-application- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 29. März 2019 06:23
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 5. April 2019 09:59
Alle Antworten
-
Hallo Frank,
Du kannst hierfür bspw. in Startup -> ConfigureServices folgendes einfügen:
services.AddMemoryCache();
und in deiner Klasse dann ggfs. noch:
using Microsoft.Extensions.Caching.Memory;
hinzufügen, falls IMemoryCache noch nicht erkannt wird.
Wenn Du die Instanz deiner Klasse manuell erzeugen willst, dann bspw. so:
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions()); ... MyClass x = new MyClass( new MemoryCache( new MemoryCacheOptions() ) );
Sinnvoller wäre es aber ggfs., auch deine Klasse über DI bereitzustellen. Bspw.:
services.AddScoped<IMyClassInterface, MyClass>();
und dann dort, wo Du es brauchst, im Konstruktor nur noch:
IMyClassInterface _myClassInstance; public MyOtherClass( IMyClassInterface myClassInstance ) { ... _myClassInstance = myClassInstance; }
anzugeben. Bzgl. Caching schau ggfs. auch mal hier:
Cache in-memory in ASP.NET Core
Zu den Unterschieden bzgl. Lebensdauer der Objekte in DI (Scoped, Transient, ...) schau mal hier:
Dependency Injection in ASP.NET Core -> Dienstlebensdauer
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport
- Bearbeitet Stefan FalzModerator Dienstag, 26. März 2019 09:12
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 29. März 2019 06:23
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 5. April 2019 09:59
-
Geholfen hat mir ein Dependency Injection Container / -Service.
Der Aufruf startet in einer CLI-Anwendung. Dort ist die Main statisch, daher kann ich schlecht was injizieren.
Nun sieht es so aus:
public static void Main(string[] args) { ServiceProvider diServiceProvider = new ServiceCollection() .AddSingleton<IMemoryCache, MemoryCache> () .BuildServiceProvider(); IMemoryCache memoryCache = diServiceProvider.GetService<IMemoryCache>();
Nun steht mir memoryCache zur Verfügung und ich kann es weitergeben nach new MyClass( memoryCache );
Geholfen hat mir vor allem dieser Link:
using-dependency-injection-in-a-net-core-console-application- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 29. März 2019 06:23
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 5. April 2019 09:59