gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:51:14 27 4
gpt4 key购买 nike

我正在尝试根据 Options pattern 使用强类型的 json 配置设置在 .net 核心中。到目前为止的所有示例都显示了将强类型设置类注入(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 并注入(inject) IOptions<MySettings>进入类构造函数以便调用 GetName 方法?

最佳答案

几点:

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

按照以下步骤:

  • 确保您已在 ConfigurationBuilder 中注册您的 JSON 文件 - mysettings.json
  • 定义MySettings

    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

  1. 创 build 置文件 - mySettings.json - 内容
{
"MySettings": {
"Name": "Some Name from config",
"Description": "Some Description from config"
}
}
  1. Startup 中配置它
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("mySettings.json", true, reloadOnChange: true)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();

if (env.IsDevelopment())
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
Configuration = builder.Build();
}

查看行:

.AddJsonFile("mySettings.json", true, reloadOnChange: true)

  1. 创建 MySettings对象来保存设置
namespace SettingsApp.Initialisations
{
public class MySettings
{
public string Name { get; set; }

public string Description { get; set; }
}
}

注意:我使用命名空间 SettingsApp.Initialisations来保存这个文件。您可以根据您的应用程序结构选择任何一个。

  1. 创建界面IMySettingsService
namespace SettingsApp.Services
{
public interface IMySettingsService
{
string GetName();
}
}

注意:我使用命名空间 SettingsApp.Services为此。

  1. 实现接口(interface) - IMySettingsService
using SettingsApp.Initialisations;
using Microsoft.Extensions.Options;

namespace SettingsApp.Services
{
public class MySettingsService : IMySettingsService
{
private readonly MySettings mySettings;

public MySettingsService(IOptions<MySettings> _mySettings)
{
mySettings = _mySettings.Value;
}

public string GetName()
{
return mySettings.Name;
}
}
}
  1. 添加选项并让系统知道您在 Startup.ConfigureServices 中的实现方法
// This method gets called by the run time. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Options
services.AddOptions();
services.Configure<MySettings>(this.Configuration.GetSection("MySettings"));
services.AddSingleton<IMySettingsService, MySettingsService>();

// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);

services.AddMvc();
}

注意包括所需的使用。

检查下面的代码,了解这是如何完成的:

// Options
services.AddOptions();
services.Configure<MySettings>(this.Configuration.GetSection("MySettings"));
services.AddSingleton<IMySettingsService, MySettingsService>();
  1. 使用实现(我正在使用 HomeController 进行测试。)
public class HomeController : Controller
{
private IMySettingsService mySettingsService;

public HomeController(IMySettingsService settingsService)
{
mySettingsService = settingsService;
}

public IActionResult Index()
{
// Get the settings
var name = mySettingsService.GetName();

return View();
}

...
  1. 查看结果:

Home controller constructor Inside the action

关于c# - 将 IOptions 传递到 .Net 核心中间件类以进行 json 配置检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39490949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com