我试图通过在.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": "*"
}
对此有任何帮助!
答案 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
类。