2017-10-08 3 views
1

Aujourd'hui, j'essayais le nouveau noyau asp.net 2.0, mais j'ai eu des problèmes avec un fichier de configuration JSON que je ne devais pas injecter dans la propriété du constructeur de configuration IConfiguration.mvc core 2.0, comment utiliser un fichier appSettings.json via la configuration

En noyau asp.net 1.1 Je voudrais utiliser ce code suivant dans StartUp:

public static IConfigurationRoot Configuration; 

Public Startup(IHostingEnvironment env) { 
    var builder = new ConfigurationBuilder() 
    .SetBasePath(env.ContentRootPath) 
    .AddJsonFile("appSettings.json", optional: false, reloadOnChange: true) 

    Configuration = builder.Build(); 
} 

et pourrait y accéder à partir du code comme:

private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"]; 

Cependant Dans Core 2.0, ils ont changé pour IConfiguration et il est déjà défini de plus je ne vois aucun moyen que je peux utiliser la configuration dans mes autres classes, donc je ne sais pas comment procéder.

Le startupClass:

using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 
using Microsoft.Extensions.Configuration; 
using Microsoft.AspNetCore.Mvc.Formatters; 
using NLog.Web; 
using NLog.Extensions.Logging; 
using cityInfoTestApi.Services; 

namespace cityInfoTestApi 
{ 
    public class Startup 
    { 

     public IConfiguration Configuration { get; private set; } 

     public Startup(IConfiguration configuration, IHostingEnvironment env) 
     { 
      Configuration = configuration; 
      env.ConfigureNLog("nlog.config"); 
     } 

     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddMvc() 
       .AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter())); 




     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddNLog(); 
      app.AddNLogWeb(); 

      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
      } 

      app.UseStatusCodePages(); 
      app.UseMvc(); 

      app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "default", 
        template: "{controller=Home}/{action=Index}/{id?}"); 
      }); 


     } 
    } 
} 

mon fichier JSON:

{ 
    "mailSetings": { 
     "mailToAddress": "admin[email protected]", 
     "mailFromAddress": "[email protected]" 
    } 
} 

ma classe personnalisée voulant utiliser les paramètres (notez qu'il était comment j'utiliserais noyau 1.1:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Threading.Tasks; 

namespace cityInfoTestApi.Services 
{ 
    public class LocalMailService : IMailService 
    { 

     private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"]; 
     private string _mailFrom = Startup.Configuration["mailSettings:mailFromAddress"]; 


     public void Send(string subject, string message) 
     { 
      Debug.WriteLine($"Mail from {_mailFrom} to {_mailTo}, with LocalMailService"); 
      Debug.WriteLine($"Subject: {subject}"); 
      Debug.WriteLine($"Message: {message}"); 
     } 
    } 
} 

toute aide serait très appréciée, Cheers!

Répondre

3

Oui, ASP.NET Core 2.0 a changé le cours de la configuration. Vous devez utiliser la méthode IWebHostBuilder.ConfigureAppConfiguration maintenant.

Ajouter quelque chose comme ceci à votre création IWebHost dans Program.cs:

.ConfigureAppConfiguration((builderContext, config) => 
{ 
    IHostingEnvironment env = builderContext.HostingEnvironment; 

    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); 
}) 

Ensuite IConfiguration exemple peut être injecté à votre classe Startup par le constructeur comme une dépendance (ou toute autre catégorie, grâce à un mécanisme DI) :

public class Startup 
{ 
    public IConfiguration Configuration { get; } 

    public Startup(IConfiguration configuration) 
    { 
     Configuration = configuration; 
    } 
    ... 
} 

Il y a un bon article qui décrit ces changements: ASP.NET Core 2.0 Configuration Changes


En ce qui concerne votre façon d'accéder aux paramètres des classes personnalisées (comme LocalMailService) - évitez d'utiliser des dépendances statiques. Cette conception DI brisée utilisée dans ASP.NET Core. Lisez à propos de l'utilisation de la fonctionnalité IOptions à la place. Ou vous pouvez encore utiliser DI et obtenir IConfiguration instance via ctor dans LocalMailService.

+2

La question est de savoir comment * utiliser * la configuration dans le reste de l'application. Cela ne répond pas à ça. – NightOwl888

+0

@ NightOwl888 merci, n'a pas été trop prudent, ont mis à jour post – Set

1

Je pense que vous pouvez utiliser IOptions pour passer un fichier de configuration à votre service. Créer une classe pour votre configuration:

public class MailSetings 
{ 
    public string MailToAddress {get;set;} 
    public string MailFromAddress {get;set} 

    public class MailSetings() { } 
} 

Configurez le service pour utiliser ces paramètres:

//... 
using Microsoft.Extensions.Configuration; 
//... 

public class Startup 
{ 
    //.. 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.Configure<MailSetings>(Configuration); 
     //... 
    } 

Maintenant, vous devriez être en mesure d'injecter dans votre constructeur de service:

//... 
using Microsoft.Extensions.Options; 

public class LocalMailService : IMailService 
{ 
    private string _mailTo; 
    private string _mailFrom; 

    public LocalMailService(IOptions<MailSetings> options) 
    { 
     _mailTo = options.Value.MailToAddress; 
     _mailFrom = options.Value.MailFromAddress; 
    } 

    //... 
}