我正在尝试根据.net核心中的Options pattern使用强类型的json配置设置。到目前为止,所有示例都显示了将强类型设置类注入(inject)到 Controller 中是多么容易,但是我需要在中间件类中使用它(非常类似于this question,但尝试这种方式后,我将不再做进一步的介绍)。

因此,设置:

mysettings.json

{
  "MySettings": {
    "Name": "Some Name from config",
    "Description": "Some Description from config"
  }
}

mysettings.cs
public class MySettings
{
    public string Name { get; set; } = "Default name";

    public string Description { get; set; } = "Default description";
}

startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MySettings>(Configuration.GetSection("MySettings"));
    services.AddSingleton<IMySettingsService, MySettingsService>();
}

MysettingsService.cs
public class MysettingsService : IMysettingsService
{
    private MySettings mySettings { get; set; }

    public MysettingsService (MySettings _mySettings)
    {
        mySettings = _mySettings.value;
    }

    public string GetName()
    {
        return mySettings.Name;
    }
}

我该如何实例化 MysettingsService.cs 并将IOptions<MySettings>注入(inject)类构造函数中,以便可以调用 GetName 方法?

最佳答案

几点:

提及的类中缺少

  • 构造函数- MysettingsService
  • 您是否在启动类中注册了 IMysettingsService 的实现?
  • 在注册实现时,可以初始化 MysettingsService ,如下所示:services.AddSingleton<IMysettingsService, MysettingsService >(i => new MysettingsService ());

  • 按着这些次序:
  • 确保已在ConfigurationBuilder中注册了JSON文件mysettings.json-
  • 定义我的设置
    public class MySettings
    {
        public string Name { get; set; }
    
        public string Description { get; set; }
    }
    
  • 定义 MySettingsService
    public class MySettingsService : IMySettingsService
    {
        private readonly MySettings mySettings;
    
        public MySettingsService (IOptions<MySettings> _mySettings)
        {
            mySettings = _mySettings.Value;
        }
    
        public string GetName()
        {
            return mySettings.Name;
        }
    }
    
  • 在启动中
    services.Configure<MySettings>(this.Configuration.GetSection("MySettings"));
    services.AddSingleton<IMySettingsService, MySettingsService >();
    

  • 编辑-我将包括实现以供您遵循

    我创建了一个示例应用程序,它对我有用。请按照以下步骤操作:

    很少的细节。
    我的应用程序名称是:SettingsApp
  • 创建包含内容
  • 的设置文件-mySettings.json-


  • Startup中配置它



  • 看到这行:


  • 创建MySettings对象以保存设置



  • 注意:我使用命名空间SettingsApp.Initialisations保留此文件。您可以根据您的应用程序结构选择任何一个。
  • 创建界面IMySettingsService



  • 注意:为此,我使用命名空间SettingsApp.Services
  • 实现接口(interface)-IMySettingsService


  • 添加选项,并通过Startup.ConfigureServices方法
  • 让系统知道您的实现



    请注意包括所需的用途。

    检查以下代码,了解如何完成此操作:


  • 使用实现(我正在使用HomeController进行测试。)


  • 查看结果:

  • c# - 将IOptions传递到.Net核心中间件类中以进行json配置检索-LMLPHP
    c# - 将IOptions传递到.Net核心中间件类中以进行json配置检索-LMLPHP

    10-08 08:02