Сопоставление интерфейса для создания класса с загруженной конфигурацией через внедрение зависимостей в .Net Core - PullRequest
0 голосов
/ 15 апреля 2019

Я написал расширение для ServiceCollection, в котором я хочу настроить свою конфигурацию Core EntityFramework Core и соответствующий DbContext.Загрузка конфигурации через json-файл работает.Теперь, где я борюсь, это то, что я хочу сопоставить свой IInstanceConfiguration с моим OracleConfiguration, как полный экземпляр.Мое текущее решение выглядит следующим образом.Я добавил два комментария, где я хотел бы знать правильный (/ лучший) способ реализации этого.

С уважением!

public static void RegisterEfCoreOracle<T>(this IServiceCollection services, string configurationDirectory, string configurationFile) where T : DbContext
    {
        //Adding configuration file
        IConfiguration configuration = new ConfigurationBuilder()
            .SetBasePath(configurationDirectory)
            .AddJsonFile(configurationFile, optional: false)
            .Build();

        services.Configure<OracleConfiguration>(configuration);

        //Do i really have to do it manually this way? What would be another, elegant way?
        var oraInstance = new OracleConfiguration(configuration.GetValue<string>("Name"), configuration.GetValue<string>("DataSource"), configuration.GetValue<string>("UserId"),
            configuration.GetValue<string>("Password"),configuration.GetValue<bool>("UseConsoleLogging"), configuration.GetValue<string>("Compatibility"));

        //This is the line where I am struggling.
        services.AddSingleton<IInstanceConfiguration, OracleConfiguration>(oraInstance);

        var oraConfig = services.ReturnServiceProvider().GetRequiredService<OracleConfiguration>();
        services.AddDbContext<T>();
    }

    public static ServiceProvider ReturnServiceProvider(this IServiceCollection services) => services.BuildServiceProvider();

1 Ответ

0 голосов
/ 15 апреля 2019

Строка var oraInstance совершенно не нужна, строка services.Configure<OracleConfiguration>(configuration); должна настраивать внедрение зависимостей, как и ожидалось.

Если тип, в который вы вводите, ожидает IInstanceConfiguration специально вместо конкретногоOracleConfiguration, вы можете зарегистрировать его следующим образом:

services.AddSingleton<IInstanceConfiguration>(sp => 
    sp.GetRequiredService<OracleConfiguration>());

В противном случае, если у вас есть контроль над типом, в который он вводится, было бы лучше вообще удалить интерфейс IInstanceConfiguration и получить егопримите IOptions<OracleConfiguration> вместо.

...