.net核心中的配置依赖注入

时间:2019-07-17 09:23:00

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

我试图通过在.net核心项目的类中获取配置来注入依赖关系。我要注入依赖项的类在另一个项目中。但是以某种方式我无法从注入的依赖项中的配置文件中获取值。 下面是我的代码

在DBContext下面,我需要从配置中获取值,在该配置中,我使用了DBConfiguration类的DI。

public class DBContext : DbContext
    {
        private readonly DBConfiguration _dBConfiguration;

        public DBContext(DBConfiguration dBConfiguration)
        {
            _dBConfiguration = dBConfiguration;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(_dBConfiguration.ConnectionString);
            base.OnConfiguring(optionsBuilder);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

还有我在Web API中的StartUp.cs文件

public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<DBConfiguration>();

            services.AddEntityFrameworkSqlServer().AddDbContext<DBContext>();

            services.AddOptions();

            services.Configure<DBConfiguration>(Configuration.GetSection("DBConfiguration"));

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

和我的appsettings.json文件

{
  "DBConfiguration": {


         "ConnectionString": "Server=myserver;Database=BaseProjectDB;Trusted_Connection=True;MultipleActiveResultSets=true",
         "ApplicationName": "WebAPI"


  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

对此有任何帮助!

3 个答案:

答案 0 :(得分:1)

在将DBConfiguration注入DBContext时,您似乎在StartUp文件中使用了DBConfigurationOptions。

这是我当前使用配置的方式:

public class Startup
{
    private readonly IConfiguration _configuration;

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

        _configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<DBConfigurationOptions>(_configuration.GetSection("DBConfiguration"));
    }
}

然后注入为:

public class DBContext : DbContext
{
    private readonly DBConfigurationOptions_dBConfiguration;

    public DBContext(IOptions<DBConfigurationOptions> dBConfiguration)
    {
        _dBConfiguration = dBConfiguration.Value;
    }
}

答案 1 :(得分:1)

为什么不直接在您也有配置的地方配置数据库?
在您的DBContext类中(顺便说一句,您可能应该为此选择一个更好的名称),您只需要公开这样的构造函数,而无需覆盖OnConfiguring或类似的东西。

此类可以在您需要的任何程序集中。

class DBContext : DbContext
{
    public DBContext(DbContextOptions<DBContext> options) : base(options)
    {
    }
}

对于配置,您可以仅使用内置的optionsBuilder-action(放在ConfigureServices方法中):

services.AddEntityFrameworkSqlServer()
    .AddDbContext<DBContext>(optionsBuilder =>
        optionsBuilder.UseSqlServer(
            Configuration.GetSection("DBConfiguration").Get<DBConfiguration>().ConnectionString)
    );

当前,您获得配置的方式肯定可以改进。例如,您可以执行以下操作:

var DBConfig = Configuration.GetSection("DBConfiguration").Get<DBConfiguration>();
services.AddSingleton(DBConfig);// <- now you can inject that if you want but it's not necessary

// now we don't need to get the config here
services.AddEntityFrameworkSqlServer()
    .AddDbContext<DBContext>(optionsBuilder =>
        optionsBuilder.UseSqlServer(DBConfig.ConnectionString)
    );

您可能还需要改进其他一些内容,例如更好地为DBContext命名,而不是覆盖没有特定实现的成员(就像您对OnModelCreating所做的那样)。

下次,您还应该包括DBConfiguration类之类的所有不属于某种公共API的类。

答案 2 :(得分:0)

要接收配置,您必须在DBContext中修改

中构造函数的签名。
public DBContext(DBConfiguration dBConfiguration)

public DBContext(IOptions<DBConfiguration> dBConfiguration)

以正确接收该选项(不要忘记添加名称空间Microsoft.Extensions.Options)。

此外,您需要使用配置文件中具有的属性在某个地方定义DBConfiguration类。