2017-10-09 1 views
0

Avant que les personnes qui ne lisent pas la question en entier votent comme étant déjà demandé, j'ai lu une douzaine de questions ici sur SO et au moins 4 messages de blog mais je ne peux pas obtenir cela pour travailler dans une solution VS2017 avec plusieurs projets de bibliothèque de classes. Cependant, je peux le faire fonctionner avec une solution avec une application web et une bibliothèque de classes, bien qu'avec un modèle différent de celui que j'ai trouvé dans la documentation et ici sur SO.Accéder aux paramètres de appsettings.json de la bibliothèque de classes dans Core 2.0

Ma solution contient 5 projets un WebApplication, d'essais, de l'infrastructure, des services, domaine (les trois derniers sont des bibliothèques de classes)

Dans le projet d'infrastructure, j'ai créé une classe appelée EmailConfigurationSettings et enregistrée dans la classe StartUp de l'application Web.

Cette classe est dans la bibliothèque de classe

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

Ceci est en StartUp.cs WebApp.

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

appsettings.json

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

J'ai besoin les paramètres du projet Services. Mais pour l'instant, j'essaie juste de m'assurer que je peux vraiment les récupérer. Le code ci-dessous suit tous les exemples de code, mais je trouve génère

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 est toujours nul

J'ai donc essayé de le tester dans le TestProject

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

thats bien null aussi.

Dans l'autre solution, celle avec la WebApp et une bibliothèque de classes, en utilisant un modèle légèrement différent que j'ai trouvé sur l'un des blogs, je peux réellement récupérer les valeurs de appsettings.json.

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

S'il vous plaît noter la classe ioptions était différent avec 9 propriétés, mais construit de la même manière que le schéma ci-dessus. Mais l'utilisation de ce modèle ne fonctionne PAS dans le projet de bibliothèque de classes multiples. S'il vous plaît aidez-moi à comprendre comment cela fonctionne dans un scénario de bibliothèque de classes multiples. Pourquoi ils ont abandonné le ConfigurationManager je ne sais pas, c'était beaucoup plus facile.

Répondre

0

Dans les microservices, vous pouvez simplement faire une liaison à un nouvel objet qui correspond à la définition json. Donc tu ferais.

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

Une fois que vous faites cela, tout ce que vous avez à faire est de demander une copie de EmailConfigurationSettings dans votre constructeur de couches de service. Cela vous donnera la dépendance injectée singleton de cet objet.

Je voudrais définir un point d'arrêt sur le "bind" et assurez-vous que la configuration de messagerie est remplie.

+0

Exécution de l'un projet mettre un point d'arrêt sur le ca AddSingleton ll (dans StartUp.cs) donne un emailConfig nul. donc cela ne fonctionne pas, même chose que les méthodes OP. – dinotom

+0

Si cela donne un résultat nul alors il n'a pas chargé sa configuration d'application correctement. Ce code est tiré de mon application mvc personnelle, donc je sais que cela fonctionne. Si vous définissez une variable sur le retour de getection, je vais me coucher il retourne null – willthiswork89

0

Voici une réponse intéressante à propos de la bibliothèque de classes: Class library.

Dans cette partie de votre code:

private readonly IOptions<EmailConfigurationSettings> _emailSettings; 

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

l'injection de dépendance ne fonctionnent pas parce que vous êtes dans une bibliothèque de classes que vous devez garder cette façon.

Quelque part dans votre webapp vous construisez 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 

     //(...) 
    } 
} 

Et le readonly privé devrait être:

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

readonly vs get/set properties

J'espère est clair et utile