[英]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.