首页 > 解决方案 > 通过.Net Core中的依赖注入映射接口以使用加载的配置来连接类

问题描述

我已经编写了一个扩展ServiceCollection,我想在其中配置我的 EntityFramework Core 配置和相应的 DbContext。通过 json 文件加载配置是可行的。现在,我正在努力的部分是我想将 my 映射IInstanceConfiguration到 my 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();

标签: c#dependency-injection.net-core

解决方案


var oraInstance行是完全没有必要的,该行services.Configure<OracleConfiguration>(configuration);应该按预期设置依赖注入。

如果您要注入的类型是特别期望IInstanceConfiguration的而不是具体的OracleConfiguration,您可以像这样注册它:

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

否则,如果您可以控制它被注入的类型,最好IInstanceConfiguration完全删除接口,并让它接受IOptions<OracleConfiguration>


推荐阅读