.Net 6:ServiceStack IAppSettings 在从 Appsettings.json 访问值时返回 Null

问题描述 投票:0回答:1

我在服务中从 Appsettings.json 访问值时遇到问题。

技术栈:微服务与ServiceStack.core:5.12.0,C#,.Net 6

我正在尝试从以下 Appsettings.json 访问值

{
  "username" : "[email protected]"
}

以下是我的配置

    public void ConfigureServices(IServiceCollection services)
    {               
        services.AddSingleton<IAppSettings, AppSettings>();
    }

配置方法:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
          app.UseServiceStack(
                new HttpServiceHost
                {
                  AppSettings = new NetCoreAppSettings(Configuration)
                });
    }

主持人班:

 public class HttpServiceHost : AppHostBase
   {
      public HttpServiceHost () : base("Test Service" , typeOf(somehandler).assembly){}
   }

我正在尝试访问类 TestConfig 构造函数(而不是处理程序)中的应用程序设置,如下所示

public class TestConfig 
{
    public class TestConfig (IAppSettings setting)
    {
       // This always comes as null 
       this.UserName = setting.GetString("username")

       // But this returns the value 
       this.UserName = HostContext.AppSettings.GetString("username")

    }

    public string UserName {get;set;}   
}

以下是对TestConfig的调用

var testConfig = new TestConfig (new AppSeetings())

如何让IAppSettings设置返回appsettings值?

注意:我正在将服务从 .Net Framework 4.5 升级到 NET 6,它可以正常工作,没有任何问题。

谢谢!

c# microservices .net-6.0 servicestack
1个回答
0
投票

您似乎正在使用 AppSettings 的新实例初始化 TestConfig,该实例不会从 appsettings.json 填充任何值。

相反,您应该将 IAppSettings 注入到您需要的类中,ASP.NET Core 依赖注入系统将为您提供配置的实例。

您需要在Startup.cs中的ConfigureServices方法中注册您的TestConfig类,以便可以将IAppSettings注入其中。

请像这样更改您的ConfigureServices方法:

csharp

public void ConfigureServices(IServiceCollection services)
{               
    services.AddSingleton<IAppSettings, NetCoreAppSettings>(s => new NetCoreAppSettings(Configuration));
    services.AddSingleton<TestConfig>();
}

然后您应该更改 TestConfig 类的实例化。您不应该直接使用 new 实例化它。相反,您应该从服务集合中检索它(通过构造函数注入或服务定位器模式)。这是控制器中构造函数注入的示例:

csharp:

public class TestController : ControllerBase
{
    private readonly TestConfig _testConfig;

    public TestController(TestConfig testConfig)
    {
        _testConfig = testConfig;
    }

    public IActionResult Index()
    {
        var username = _testConfig.UserName;
        //...
    }
}

在上面的示例中,TestConfig 实例通过.NET 依赖注入系统注入到控制器中,并且可以从中访问 UserName。

确保您没有像此处那样在代码中的任何位置创建 AppSettings 的新实例:var testConfig = new TestConfig(new AppSettings())。相反,您应该从服务集合中检索已配置的实例。

另外,请记住确保将 appsettings.json 文件复制到输出目录。您可以通过转到文件属性并将“复制到输出目录”设置为“如果较新则复制”来确保这一点。

© www.soinside.com 2019 - 2024. All rights reserved.