1
votes

Obtenir une instance du service singleton au démarrage

J'ai la situation suivante:

startup.cs

services.AddSingleton<IConfigurationManager, ConfigurationManager>();
ConfigurationManager configurationManager = new ConfigurationManager();
services.AddDbContext<MyContext>(options => 
    options.UseSqlServer(configurationManager.DatabaseConnectionString));

Donc, pour créer mon contexte, j'ai besoin de la chaîne de connexion que ce configurationManager me fournit. Cependant, je souhaite toujours conserver le ConfigurationManager en tant que service.

Y a-t-il un moyen de faire cela sans instancier explicitement le configurationManager ou est-ce peut-être même bien de le laisser comme ça?


1 commentaires

Utilisez IConfiguration qui est injecté dans les méthodes Startup dans ASP.NET Core


3 Réponses :


1
votes

Vous pouvez également faire quelque chose de similaire. Je ne connais pas ce que vous faites avec votre gestionnaire de configuration pour fournir une réponse précise.

En gros, vous pouvez faire une pré-configuration dans votre Program.cs.

Construisez votre configuration ici. Comme vous pouvez le voir, je passe IConfigurationBuilder .

Program.cs

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(AddDbConfiguration)
        .UseStartup<Startup>();


private static void AddDbConfiguration(WebHostBuilderContext context, IConfigurationBuilder builder)
{
    var configuration = builder.Build(); // you could instantiate you Configuration manager here and append to the configuration.
    var connectionString = configuration.GetConnectionString("Database");
    builder.AddDemoDbProvider(options => options.UseSqlServer(connectionString));
}

source: https://medium.com/@dneimke/custom-configuration-in-net-core-2-193ff6f02046


2 commentaires

C'est un scénario différent: dans l'exemple fourni, le but est de charger la configuration stockée dans une base de données. La base de données résultante n'est pas accessible à l'application ASP.NET Core.


@ Métoule tu as raison. Bien sûr, il pouvait facilement modifier le code pour l'adapter à sa solution. J'utilise le même code que celui de la source à laquelle je me réfère. C'est comme ça que je vais pour ma configuration. Je trouve que c'est très flexible. Il peut également instancier dans Program pour créer une meilleure IConfiguration. Ce qui est déjà dans la DI d'asp.net etc.



2
votes

Vous pouvez utiliser le fournisseur de services pour obtenir des instances de services:

Construisez le fournisseur de services - var provider = services.BuildServiceProvider ();

Obtenez un service spécifique -

provider.GetService();

Bien qu'une meilleure option serait d'utiliser l'IConfiguration .NET Core fournit - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

En utilisant cette méthode, vous pouvez définir IConfiguration pour analyser vos paramètres de configuration dans la méthode Startup . De là, vous pouvez ensuite injecter ces paramètres dans les classes requises.


2 commentaires

L'emplacement de service est-il le meilleur moyen?


Non, je suivrais toujours la voie IConfiguration, j'ai fait l'hypothèse que cette question était interdite, je l'ai donc ajoutée à ma réponse



2
votes

Il est possible d'accéder à IServiceProvider lors de la construction du contexte:

public class Startup
{
    public IConfiguration Configuration { get; }
    public IHostingEnvironment HostingEnvironment { get; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        Configuration = configuration;
        HostingEnvironment = env;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<MyContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("MyContext"));
        });
    }
}

Cependant, ici, vos meilleures options pourraient être de lire le code Iconfiguration > injecté dans Startup.cs :

services.AddDbContext<MyContext>((serviceProvider, options) =>
{
    var configManager = serviceProvider.GetService<IConfigurationManager>();
    options.UseSqlServer(configManager.DatabaseConnectionString);
});


0 commentaires