2016-10-11 6 views
0

Gibt es eine richtige Art und Weise meine Dienste zu erklären, als das:ASP.NET-Core und Dependency Injection

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."])); 
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], new Logger(Configuration["..."]))); 

Ich würde „neuen Logger“ 2 mal zu vermeiden wie zu erklären.

Edit: Der Katalogservice nimmt auch eine Zeichenfolge im Konstruktor.

public CatalogService(ILogger logger, string path) 
{ 
} 

und

public Logger(string value) 
{ 
} 
+0

sieht gut aus, weiß das nicht! – Tim

Antwort

3

Dies sollte funktionieren:

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."])) 
services.AddTransient<ICatalogService, CatalogService>(); 

In CatalogService Klasse gibt es so etwas wie dies sein wird:

public class CatalogService(ILogger logger) { 
... 
} 

Wie Sie bereits die Umsetzung registriert haben für ILogger, th Der IOC erstellt automatisch eine Instanz für Ihre Klasse CatalogService.

BEARBEITEN: Basierend auf Ihrer Ausgabe ist es nicht notwendig, ein new Configuration jedes Mal zu injizieren. Registrieren Sie einfach die Implementierung für Ihre IConfiguration und es wird bei Bedarf automatisch injiziert. Ich habe nicht getestet, sollte aber so etwas wie dies:

services.AddSingleton<IConfiguration>(Configuration); 
services.AddTransient<ILogger, Logger>() 
services.AddTransient<ICatalogService, CatalogService>() 

By the way, this link könnte Ihnen helfen.

+0

Entschuldigung, meine Frage war nicht präzise genug. Ich habe Precsionen hinzugefügt – Tim

+0

@Tim: Registrieren Sie Ihre 'Konfiguration' separat. – Steven

+0

meinst du mit IOptions-Muster? – Tim

1

Sie sollten das Muster IOption<T> wo immer möglich verwenden, siehe the documentation für weitere Informationen.

Wenn Sie das Muster IOptions<T> nicht verwenden können (d. H. Logger wird in einer Bibliothek eines Drittanbieters oder einer Legacy-Bibliothek definiert, die dieses Muster nicht unterstützt), können Sie den Logger in der Factory-Methode auflösen.

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."])); 
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], provider.GetService<ILogger>())); 

Auf diese Weise wird der Logger von der zuvor konfigurierten Konfiguration aufgelöst. Aus diesem Grund wird die provider in die Factory-Methode übernommen.