繁体   English   中英

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

[英]Dependency Injection with configuration in .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": "*"
}

任何帮助对此表示赞赏!

在将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;
    }
}

为什么不直接在您也有配置的地方配置数据库?
在您的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所做的OnModelCreating )。

另外,下一次您应该包括所有不属于某种公共API的类,例如DBConfiguration类。

要接收配置,您必须从以下位置修改DBContext构造函数的签名:

public DBContext(DBConfiguration dBConfiguration)

public DBContext(IOptions<DBConfiguration> dBConfiguration)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM