C# 从数据层访问appsetting,而不使用参数创建实例化

C# 从数据层访问appsetting,而不使用参数创建实例化,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,如何访问业务/数据层中的“appsettings.js”值而不在构造函数级别创建实例化 我可以访问控制器中的所有值,但我不想像传递构造函数参数那样发送到我的所有层 我试图理解这篇文章,但我不完全理解。有人能给我一些没有创建实例化的示例代码吗 控制器-服务-数据库服务(无参数构造函数? appsetting.json "DbSettings":{ "ConnectionString" : "TESTING Connection string here" } 控制器: public

如何访问业务/数据层中的“appsettings.js”值而不在构造函数级别创建实例化

我可以访问控制器中的所有值,但我不想像传递构造函数参数那样发送到我的所有层

我试图理解这篇文章,但我不完全理解。有人能给我一些没有创建实例化的示例代码吗

控制器-服务-数据库服务(无参数构造函数?

appsetting.json

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