使用 autofac 获取所有 IOptions 对象的集合

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

我希望能够获取在 autofac 中注册的所有

IOptions<T>
的集合,以便我可以将它们保存到自定义 JSON 文件中。比如:

class OptionsManager(IEnumerable IOptions)

我不知道这是否可能,因为据我所知,没有非通用的

IOptions
接口,而且目前我实际上并没有注册选项本身,我构建了一个添加它们的服务集合,然后得到通过扩展填充我的容器:

var builder = new ContainerBuilder();
var serviceCollection = new ServiceCollection().AddOptions();
builder.Populate(serviceCollection);

无论如何,这并没有公开任何方式让我在单个界面下注册这些选项。

我可以在我自己的通用接口、

IOptions
或公共基类或其他东西下注册所有类。但这并不妨碍我使用该接口之外的类作为
IOptions<T>
并且进一步,我不认为我注册的类与
IOptions<T>
注册提供的类相同,所以它不会连工作都没有。

我可以完全放弃

IOptions<T>
,但这意味着我必须公开自己的
Options
接口供其他人实现,我可以这样做,但我不愿意。

c# autofac ioptions
1个回答
0
投票

您可以尝试以下示例注册到

IOptions<object>

控制台应用程序,包
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Options
``
应用程序设置.json

{
  "Option1": {
    "Name": "Tom"
  },
  "Option2": {
    "Age": 14
  }
}

选项类型

    public class Option1
    {
        public string Name { get; set; }
    }
    public class Option2 
    {
        public int Age { get; set; }
    }
Console.WriteLine("Hello, World!");

var builder = new ContainerBuilder();

var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
builder.Register(c => Options.Create(config.GetSection("Option1").Get<Option1>())).As<IOptions<object>>();
builder.Register(c => Options.Create(config.GetSection("Option2").Get<Option2>())).As<IOptions<object>>();

var container = builder.Build();

var optionsList = container.Resolve<IEnumerable<IOptions<object>>>();

Console.ReadLine();

测试结果

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