gpt4 book ai didi

c# - 将强类型配置设置直接访问到 ASP.NET 5 (vNext) 中的类库中?

转载 作者:行者123 更新时间:2023-11-30 20:40:06 25 4
gpt4 key购买 nike

我有一个 ASP.NET 5 MVC 6 应用程序。它有一个数据访问库,需要一个连接字符串来连接到数据库。目前,我正在将带有连接字符串的强类型配置设置类作为公共(public)属性从 MVC Controller (通过 DI 接收)一直传递到数据访问类库。

我想知道是否有更好的方法让类库使用依赖注入(inject)或任何其他机制来访问强类型配置设置?

谢谢。

编辑:代码示例

这是一个从业务层调用的通用 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);
}
}

查询类根据提供给它的连接字符串创建连接对象。

最佳答案

我同意@Steven 使用 IOptions<T> 的观点是个坏主意。但是,您可以使用 ConfigurationBinder扩展以将配置的特定部分读出到强类型的 POCO 类中。只要确保你在 project.json 的 dependencies 中有这个部分:

"dependencies": {
[other dependencies],
"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final",
[other dependencies]
}

只需像往常一样构建您的配置。例如,假设您有一个如下所示的 Database.json 配置文件:

{
"Database": {
"ConnectionInfo": {
"connectionString": "myConnectionString"
}
}
}

您可以从 Startup 构建您的配置Startup.cs 中的方法:

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();
}

现在我们可以创建一个 POCO 类来匹配 "Database:ConnectionInfo" JSON 配置文件的一部分。您可以按照@janhartmann 的建议将它与接口(interface)匹配,但这可能是必要的,也可能不是必要的。

public class DatabaseConnectionInfo {
public string ConnectionString { get; set; }
}

现在,我们怎样才能得到 DatabaseConnectionInfo使用 JSON 配置文件中的数据填充的类?一种方法是使用 IOptions<T>框架类型,但我不喜欢在可以避免的情况下使用框架类型。相反,您可以获得这样的实例:

DatabaseConnectionInfo dbConnInfo = Configuration
.GetSection("Database:ConnectionInfo")
.Get<DatabaseConnectionInfo>();

现在您可以注册 dbConnInfo类型为 DatabaseConnectionInfo 类型的单例(或者如果您希望拥有不可变的配置设置对象,则作为接口(interface)类型的单例)。一旦它在 IoC 容器中注册,您可以构造函数在需要的地方注入(inject)它:

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) { ... }
}

关于c# - 将强类型配置设置直接访问到 ASP.NET 5 (vNext) 中的类库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33734636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com