我希望能够获取在 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
接口供其他人实现,我可以这样做,但我不愿意。
您可以尝试以下示例注册到
IOptions<object>
:Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Options
``{
"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();