C# 从数据层访问appsetting,而不使用参数创建实例化
如何访问业务/数据层中的“appsettings.js”值而不在构造函数级别创建实例化 我可以访问控制器中的所有值,但我不想像传递构造函数参数那样发送到我的所有层 我试图理解这篇文章,但我不完全理解。有人能给我一些没有创建实例化的示例代码吗 控制器-服务-数据库服务(无参数构造函数? appsetting.jsonC# 从数据层访问appsetting,而不使用参数创建实例化,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,如何访问业务/数据层中的“appsettings.js”值而不在构造函数级别创建实例化 我可以访问控制器中的所有值,但我不想像传递构造函数参数那样发送到我的所有层 我试图理解这篇文章,但我不完全理解。有人能给我一些没有创建实例化的示例代码吗 控制器-服务-数据库服务(无参数构造函数? appsetting.json "DbSettings":{ "ConnectionString" : "TESTING Connection string here" } 控制器: public
"DbSettings":{
"ConnectionString" : "TESTING Connection string here"
}
控制器:
public class TestController : ControllerBase
{
public TestController(IOptions<DbSettings> dbSettings)
{
_balService = new BALServices(dbSettings.Value); // passing parameter "dbsetting" to constructor which i don't want.
}
}
该框架并不是真正设计为允许您这样做的。NET内核使用依赖项注入,并强制您遵循它,因为在DI容器之外几乎所有东西都是不可访问的。因此,每当某个东西依赖于某个东西时,它应该通过在构造函数中期望它来明确该依赖关系。这就是它的设计方式 也就是说,创建一个新的
BALServices
实例也不是真正的依赖注入。如果要在控制器中使用BALServices
,则控制器不应创建其自身的实例,而应仅依赖于该类型
因此,您可以将控制器更改为如下所示:
public class TestController : ControllerBase
{
private readonly BALServices _balService;
public TestController(BALServices balService)
{
_balService = balService;
}
}
现在,控制器不需要担心如何创建该对象。这取决于它的存在,并让其他人知道这一点。这正是依赖注入的意义所在
为了实现这一点,您现在当然需要调整BALServices
以依赖这些IOptions
:
public class BALServices
{
private readonly DbSettings _dbSettings;
public BALServices(IOptions<DbSettings> dbSettings)
{
_dbSettings = dbSettings.Value;
}
}
现在您有了TestController
取决于它想要使用的实际服务,而BALServices
取决于它需要的配置。DI容器将自动为您提供您需要的内容
public class TestController : ControllerBase
{
private readonly BALServices _balService;
public TestController(BALServices balService)
{
_balService = balService;
}
}
public class BALServices
{
private readonly DbSettings _dbSettings;
public BALServices(IOptions<DbSettings> dbSettings)
{
_dbSettings = dbSettings.Value;
}
}
services.AddScoped<BALServices>();