Nab*_*apa 3 c# dependency-injection asp.net-core-mvc asp.net-core
我有一个 ASP.NET 5 MVC 6 应用程序。它有一个数据访问库,需要一个连接字符串来连接到数据库。目前,我正在将一个带有连接字符串的强类型配置设置类作为公共属性从 MVC 控制器(通过 DI 接收)一直传递到数据访问类库。
我想知道类库是否有更好的方法来使用依赖项注入或任何其他机制访问强类型配置设置?
谢谢。
编辑:代码示例
这是一个从业务层调用的通用 DbTransaction 类。
public class DbTransactions<TEntity> where TEntity : DbEntity, new()
{
private readonly Query _query;
public DbTransactions(string connectionString)
{
_query = new Query(connectionString);
}
public TEntity GetById(long id)
{
var sqlGenerator = new SqlGenerator<TEntity>();
var sql = sqlGenerator.GetSelectByIdQuery();
var mapper = new NMapper.Mapper<TEntity>();
var cmd = _query.GetNpgsqlCommand(sql, new { id });
return mapper.GetObject(cmd);
}
}
Run Code Online (Sandbox Code Playgroud)
查询类根据提供给它的连接字符串创建连接对象。
我同意@Steven 的观点,使用IOptions<T>是一个坏主意。但是,您可以使用ConfigurationBinder扩展将配置的特定部分读出到强类型 POCO 类中。只需确保您的 project.jsondependencies部分中有此内容即可:
"dependencies": {
[other dependencies],
"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final",
[other dependencies]
}
Run Code Online (Sandbox Code Playgroud)
只需像平常一样构建您的配置即可。例如,假设您有一个如下所示的 Database.json 配置文件:
{
"Database": {
"ConnectionInfo": {
"connectionString": "myConnectionString"
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过 Startup.cs 中的方法构建配置Startup:
public IConfiguration Configuration { get; private set; }
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) {
IConfigurationBuilder configBuilder = new ConfigurationBuilder()
.SetBasePath(appEnv.ApplicationBasePath)
.AddJsonFile("Database.json")
.AddEnvironmentVariables()
Configuration = configBuilder.Build();
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以创建一个 POCO 类来匹配"Database:ConnectionInfo"JSON 配置文件的部分。您可以按照 @janhartmann 的建议将其与接口匹配,但这可能是必要的,也可能不是必要的。
public class DatabaseConnectionInfo {
public string ConnectionString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,我们如何使用DatabaseConnectionInfoJSON 配置文件中的数据填充该类?一种方法是使用IOptions<T>框架类型,但当我可以避免它们时,我不喜欢使用框架类型。相反,您可以获得像这样的实例:
DatabaseConnectionInfo dbConnInfo = Configuration
.GetSection("Database:ConnectionInfo")
.Get<DatabaseConnectionInfo>();
Run Code Online (Sandbox Code Playgroud)
现在,您可以将该dbConnInfo类型注册为该类型的单例DatabaseConnectionInfo(如果您希望拥有不可变的配置设置对象,则可以将其注册为接口类型的单例)。一旦它在 IoC 容器中注册,您就可以在需要时在构造函数中注入它:
public class DbTransactions<TEntity> where TEntity : DbEntity, new()
{
private readonly Query _query;
public DbTransactions(DatabaseConnectionInfo dbConnInfo)
{
_query = new Query(dbConnInfo.ConnectionString);
}
public TEntity GetById(long id) { ... }
}
Run Code Online (Sandbox Code Playgroud)