J'utilise asp.net + Autofac.
J'essaie de charger un fichier de configuration JSON personnalisé, et soit de créer/instance une instance IConfiguration basée sur cela, soit au moins d'inclure mon fichier dans les constructions IC.net de configuration IConfiguration par défaut.
Mon problème est que asp.net semble remplacer l'enregistrement de dépendance pour IConfiguration.
Je n'arrive pas à enregistrer mon propre objet IConfiguration - le conteneur DI résoudra toujours cela en une instance qui semble avoir été générée par la bibliothèque asp.net elle-même.
Et je ne sais pas comment obtenir asp.net pour charger au moins mon fichier de configuration personnalisé en plus - c'est-à-dire s'il existe un moyen d'obtenir le ConfigurationBuilder qu'il utilise et d'ajouter mon propre fichier avant de construire IConfiguration objet.
J'ai essayé ce qui suit:
public class Startup
{
public IConfigurationRoot Configuration { get; }
public Startup(IHostingEnvironment env)
{
this.Configuration = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("somefile.json")
.Build();
}
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add framework services.
services
.AddMvc()
.AddControllersAsServices();
var builder = new ContainerBuilder();
builder.Register(x => this.Configuration).As<IConfiguration>();
builder.Populate(services);
var container = builder.Build();
// This will return another IConfiguration instance then the one I registered;
// namely One that contains 1 provider, a MemoryConfigurationProvider
var xxx = container.Resolve<IConfiguration>();
return new AutofacServiceProvider(container);
}
}
Comment puis-je demander à asp.net de charger également mon fichier de configuration JSON personnalisé?
Vous pouvez le faire en utilisant le modèle Options :
Sur ASP.NET Core 2, enregistrez le fichier de configuration sur Program.cs
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
// custom config file
.AddJsonFile("myappconfig.json", optional: false, reloadOnChange: false)
.Build();
BuildWebHost(args, configuration).Run();
}
public static IWebHost BuildWebHost(string[] args, IConfiguration config) =>
WebHost.CreateDefaultBuilder(args)
.UseConfiguration(config)
.UseStartup<Startup>()
.Build();
}
Créez une classe qui correspond à votre fichier de configuration:
public class MyAppConfig
{
public string SomeConfig { get; set; }
public int NumberConfig { get; set; }
}
Enregistrez-le sur ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<MyAppConfig>(Configuration);
}
Ensuite, accédez-y simplement dans votre Controller:
[Route("api/[controller]")]
public class ValuesController : Controller
{
private readonly MyAppConfig _appConfig;
public ValuesController(IOptions<MyAppConfig> optionsAccessor)
{
if (optionsAccessor == null) throw new ArgumentNullException(nameof(optionsAccessor));
_appConfig = optionsAccessor.Value;
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return _appConfig.SomeConfig;
}
}
Si vous n'êtes pas encore dans ASP.NET Core 2, le processus est presque le même. Vous avez juste besoin d'ajouter le fichier de configuration personnalisé sur Startup.cs
. Le reste est fondamentalement le même.
Pour .Net Core 2.2, vous devez modifier Program.cs:
Avant
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
Après
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//This is how you attach additional JSON files
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("customSettings.json", optional: false, reloadOnChange: false);
})
//End of update
.UseStartup<Startup>();
Pour les dernières modifications et pour ajouter d'autres types de paramètres personnalisés, reportez-vous à la documentation Microsoft à l'adresse suivante article .