【问题标题】:Reading appsettings.json in .net core only works in HomeController在 .net 核心中读取 appsettings.json 仅适用于 HomeController
【发布时间】:2019-08-15 15:28:06
【问题描述】:

我的 .net 核心 MVC 应用程序,当我从 HomeController 读取 appsettings.json 时,它可以工作,但在其他类中,AppSettings 对象从未初始化。

谁能找出问题所在?

我创建了我的自定义类 AppSettings,其中属性名称映射到 appsettings.json 中的部分。

我已将其包含在 Startup.cs 中。

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

它在 HomeController 中工作:

 private static AppSettings AppSettings { get; set; }

    public HomeController(IOptions<AppSettings> settings)
    {
        AppSettings = settings.Value;
    }

    private void TestMethod()
    {
        // This works inside the HomeController
        var dbString = AppSettings.DataBaseConnectionString;
    }

然而,BusinessLogic 类中的这个构造函数永远不会被调用:

private static AppSettings AppSettings { get; set; }

    public BusinessLogic(IOptions<AppSettings> settings)
    {
        AppSettings = settings.Value;
    }
    private void TestMethod()
    {
        // This does NOT work inside the BusinessLogic class. Appsettings is null.
        var dbString = AppSettings.DataBaseConnectionString;
    }

【问题讨论】:

  • 你的“BusinessLogic”类和“HomeController”在同一个项目中吗?
  • 是的,他们在同一个项目中。
  • 您将设置对象注入到构造函数中。为此,您应该将 BusinessLogic 类注册为 IoC 容器中的服务。是这样吗?这个 BusinessLogic 类在哪里使用?
  • BLogic 类直接从 HomeC 调用,一切都在同一个 MVC 项目中。 HomeController.cs 位于 Controllers 文件夹中,因为它位于标准 MVC 项目中。 BusinessLogic.cs 位于另一个名为 Logic 的文件夹中,并且仅在此解决方案中的其他部分调用此类。为什么相同的代码在 HomeC 中有效,但在 i BLogic 中无效?我正在以完全相同的方式进行操作,并且没有以任何特殊方式注册 HomeC。关于 IoC 容器,我无法真正回答你,这个术语对我来说是新的。
  • services.AddOptions();你添加了吗?

标签: .net-core asp.net-core-mvc


【解决方案1】:

你可以在Startup.ConfigureServices注册你的班级到DI系统:

services.AddTransient<BusinessLogic>();

然后你可以在任何地方注入类,例如在控制器中:

private readonly BusinessLogic _businessLogic ;

public HomeController(BusinessLogic businessLogic) {
    _businessLogic = businessLogic;
}

您可以了解不同的生命周期和注册选项:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection

【讨论】:

  • 抱歉有点慢,但为什么我必须在 HomeController 中使用 BusinessLogic 类?我的意思是,HomeC 只是接收请求,然后调用 BLogic 中的一个方法,然后 BLogic 会调用 DatabaseLogic、ADLogic 等。我只希望这些类中的每一个都能够从 appsettings.json 获取信息。如果类必须相互注入才能到达 appsettings.json,这似乎是一个糟糕的解决方案。
  • 你想在哪里调用BusinessLogic类?你只需要注入BusinessLogic如上图,在控制器中使用BusinessLogic只是一个代码示例,你可以根据你的需要做你想做的事。
  • 也许我不清楚,或者我不明白你的意思是“你想在哪里调用 BusinessLogic 类?”在我的 HomeController 中,我可以只编写“BusinessLogic.MyMethod()”,然后在 BusinessLogic 类中的 MyMethod() 中的断点命中。问题不在于到达 BusinessLogic,问题在于 BusinessLogic 从 appsettings.json 中获取值。据我了解,这是 BLogic 和 appsettings.json(以及一些类似 Startup.cs)之间的问题,与 HomeC 完全无关。
  • 尝试我的代码在控制器中注入BusinessLogic,然后使用_businessLogic.MyMethod(),检查是否可以获得appsetting值。
  • 成功了。我必须添加 services.AddTransient();有几次,我想从 appsettings.json 读取的每个班级都有一个。然后,我必须在 HomeController 构造函数中传入每个类。非常感谢你的帮助。然而,有一件事让我烦恼,这真的是在 HomeController 中进行此编码的正确方法吗?如果我也有 ProductController 怎么办?在我看来,这将是很多参考和不必要的编码,还有一些硬编码的依赖关系。
猜你喜欢
  • 2022-06-21
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
相关资源
最近更新 更多