微软.扩展.选项您必须手动将其通过整个堆栈吗



我第一次实现appsettings.json来代替app.config,所以请原谅我在研究中未能找到令人满意的解决方案的潜在愚蠢问题。

我有一个由a提出的解决方案。NetCore2.0Webneneneba API和依赖项目将我的解决方案分解为类库层。我需要从底层持久层类库中获取存储在顶层appsettings.json(在我的Web API下(中的连接字符串。

我发现这篇文章一步一步地解释它。终于开始工作了。

注意: 我用connectionString测试了这个功能,但我还需要其他变量,我计划稍后再做

我的问题是,一旦我实现了所需的构造函数:

public Data(IOptions<ConnectionStrings> connectionStrings)
{
ConnectionStrings = connectionStrings;
}

我必须手动将IOptions对象一直传递到堆栈中。

Data date = new Data(ConnectionStrings);

有没有类似于ConfigurationManager给您的解决方案不需要我一直传递IOptions对象?

我肯定做错了什么,不是吗?

在构建我的第一个dotnet core 2应用程序时,我也有类似的问题。我提出的解决方案是配置依赖注入,将T解析为IOptions<T>.Value,例如:

services.AddTransient<SomeOptions>(sp => 
sp.GetService<IOptions<SomeOptions>>().Value);

如果您对需要在构造函数中提供SomeOptions的对象使用依赖项注入,则此操作效果良好。如果您手动"新建"对象,则不会真正提供太多价值。

我不完全确定你的应用程序是什么样子的,但从上面的例子来看,你有一个Data类,它在构造函数中接受了IOptions<ConnectionStrings>参数。

在您的启动中给定以下代码:

// I don't have your entire project - just looking at your link above, I came up with this
services.Configure<ConnectionStrings> 
(Configuration.GetSection("ConnectionStrings"));
services.AddTransient<ConnectionStrings>(sp => 
sp.GetService<IOptions<ConnectionStrings>>().Value);
services.AddTransient<Data>();

您可以将数据类定义为:

public class Data
{
private readonly ConnectionStrings _connectionStrings;
public Data(ConnectionStrings connectionStrings)
{
//I don't know what you need to do with this here - just guessing
_connectionStrings = connectionStrings;
}
}

您可以将控制器类定义为:

public class SomeController
{
private readonly Data _data;
public SomeController(Data data) 
{
_data = data;
}
public IActionResult Get() 
{
// do something with _data here
// don't new it up - it gets injected!
}
...
}

最新更新