2017-10-09 1 views
0

Bevor die Leute, die die ganze Frage nicht lesen, diese als bereits gefragt, habe ich ein Dutzend Fragen hier auf SO und mindestens 4 Blog-Posts gelesen aber ich kann das nicht in einer VS2017-Lösung mit mehreren Klassenbibliothek-Projekten arbeiten. Ich kann es jedoch mit einer Lösung mit einer Webanwendung und einer Klassenbibliothek arbeiten lassen, wenn auch mit einem anderen Muster als das, das ich in der Dokumentation und hier auf SO gefunden habe.Zugriff auf Einstellungen von appsettings.json aus der Klassenbibliothek in Core 2.0

Meine Lösung enthält 5 Projekte ein WebApplication, Testing, Infrastruktur, Dienstleistungen, Domain (letztere drei sind Klassenbibliotheken)

Im Infrastrukturprojekt, das ich eine Klasse namens EmailConfigurationSettings erstellt und registriert es in der StartUp-Klasse von die WebApp.

Diese Klasse ist in Klassenbibliothek

public class EmailConfigurationSettings 
{ 
    public string Provider { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
} 

Dies ist in StartUp.cs in WebApp.

services.Configure<EmailConfigurationSettings>(Configuration.GetSection("EmailConfigurationSettings")); 
services.AddOptions(); 

appsettings.json

"EmailConfigurationSettings": { 
    "Provider": "gmail", 
    "Username": "[email protected]", 
    "Password": "mypassword" 
} 

Ich brauche die Einstellungen im Projektdienstleistungen. Aber im Moment versuche ich nur sicherzustellen, dass ich sie tatsächlich abrufen kann. Der folgende Code folgt die alle Code-Beispiele Ich fand aber erzeugt

public class LoadEmailSettingsFromAppSettings 
{ 
    private readonly IOptions<EmailConfigurationSettings> _emailSettings; 

    public LoadEmailSettingsFromAppSettings(IOptions<EmailConfigurationSettings> emailSettings) 
    { 
     _emailSettings = emailSettings; 
     Message = "Our provider is " + _emailSettings.Value.Provider; 
    } 

    public string Message { get; set; } 
} 

_emailSettings ist immer null

Also versuchte ich es in der Testproject

IOptions<EmailConfigurationSettings> someOptions = Options.Create<EmailConfigurationSettings>(new EmailConfigurationSettings()); 

Nun, das ist null zu testen. In der anderen Lösung, die mit der WebApp und einer Klassenbibliothek, , benutze ich ein etwas anderes Muster, das ich auf einem der Blogs gefunden habe, kann ich tatsächlich die Werte von appsettings.json abrufen.

public class AuthMessageSender : IEmailSender, ISmsSender 
{ 
    public AuthMessageSender(IOptions<EmailConfig> emailSettings) 
    { 
     _emailSettings = emailSettings.Value; 
    } 

    public EmailConfig _emailSettings { get; } 

    public Task SendEmailAsync(string email, string subject, string message) 
    { 
     Execute(email, subject, message).Wait(); 
     return Task.FromResult(0); 
    } 

Class populated from appsettings.json

Bitte beachten Sie die ioptions Klasse mit 9 Eigenschaften anders war, aber die gleiche Art und Weise wie das Muster oben aufgebaut.

Die Verwendung dieses Musters funktioniert jedoch NICHT im Projekt mit mehreren Klassenbibliotheken. Bitte helfen Sie mir zu verstehen, wie Sie dies in einem Szenario mit mehreren Klassenbibliotheken zum Laufen bringen können.

Warum sie den ConfigurationManager aufgegeben haben weiß ich nicht, es war viel einfacher.

Antwort

0

In Microservices können Sie einfach eine Bindung an ein neues Objekt, das die JSON-Definition entspricht, machen. Also würdest du tun.

var emailConfig = new EmailConfigurationSettings(); 
Configuration.GetSection("EmailConfigurationSettings").Bind(emailConfig); 
services.AddSingleton(emailConfig); 

Sobald Sie dies tun, alles, was Sie tun müssen, ist eine Kopie von EmailConfigurationSettings in Ihrem Service-Layer-Konstruktor anfordern. Dies gibt Ihnen die Abhängigkeit injiziert Singleton dieses Objekts.

Ich würde einen Haltepunkt auf der "Bindung" setzen und stellen Sie sicher, dass E-Mail-Konfiguration ausgefüllt ist.

+0

Ausführen des Projekts eine klare und hilfreiche Setzen eines Haltepunktes auf AddSingleton ca ll (In StartUp.cs) liefert eine leere emailConfig. also funktioniert das nicht, genauso wie die OP-Methoden. – dinotom

+0

Wenn das Ergebnis null ergibt, hat er seine App-Konfiguration nicht richtig geladen. Dieser Code stammt aus meiner persönlichen mvc-App, also weiß ich, dass es funktioniert. Wenn Sie eine Variable auf die Rückkehr von getsection setzen, werde ich Bett, es gibt null zurück – willthiswork89

0

Hier ist eine interessante Antwort über die Klassenbibliothek: Class library.

In diesem Teil des Codes:

private readonly IOptions<EmailConfigurationSettings> _emailSettings; 

public LoadEmailSettingsFromAppSettings(IOptions<EmailConfigurationSettings> emailSettings) 
{ 
    _emailSettings = emailSettings;   

die Dependency Injection nicht funktionieren, weil Sie in einer Klassenbibliothek, so dass Sie es auf diese Weise behalten sollen.

Irgendwo in Ihrem Webapp Sie LoadEmailSettingsFromAppSettings

public class SomeClass 
{ 
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp 
    { 
     var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library 

     //(...) 
    } 
} 

Und der private Nur-Lese sollte konstruieren:

public IOptions<EmailConfigurationSettings> EmailSettings {get; private set;} 

readonly vs get/set properties

Ich hoffe, ist

Verwandte Themen