Configuration 带有简单注入器的旧式.NET应用程序中的选项模式、配置

Configuration 带有简单注入器的旧式.NET应用程序中的选项模式、配置,configuration,simple-injector,configurationmanager,legacy-code,.net-core-configuration,Configuration,Simple Injector,Configurationmanager,Legacy Code,.net Core Configuration,本文介绍如何将选项模式与Autofac结合使用。我试着把它翻译成简单的注入器。但是我没有运气。 这是我的国际奥委会代码 公共类IocBootstrap2 { 专用容器{get;} 公共IocBootstrap2 { 容器=新容器; var configurationBuilder=新的configurationBuilder .SetBasePathPath.CombinesSystem.AppDomain.CurrentDomain.BaseDirectory,配置 .AddJsonFiles

本文介绍如何将选项模式与Autofac结合使用。我试着把它翻译成简单的注入器。但是我没有运气。 这是我的国际奥委会代码

公共类IocBootstrap2 { 专用容器{get;} 公共IocBootstrap2 { 容器=新容器; var configurationBuilder=新的configurationBuilder .SetBasePathPath.CombinesSystem.AppDomain.CurrentDomain.BaseDirectory,配置 .AddJsonFilesettings.json,可选:false,重载更改:true; var configuration=configurationBuilder.Build; //注册选项 Container.registerTypeOfOptions,TypeOfOptions Manager; Container.RegisterTypeOfOptionMonitor,TypeOfOptionMonitor; Container.RegisterTypeOfOptionFactory,TypeOfOptionFactory; Container.RegisterTypeOfOptionMonitorCache,TypeOfOptionCache; //注册配置选项 Container.RegisterConfiguration选项2Configuration.GetSectionMail; 如果调试 容器。验证; 恩迪夫 } } 公共静态类配置SetupExtensions2 { 公共静态无效注册表配置选项2此容器容器,IConfiguration配置 地点:班级 { container.RegisterTypeOfOptions ChangeTokenSource, =>新配置ChangeTokenSourceConfig,Lifestyle.Transient; container.RegisterTypeOfConfigureOptions, =>新配置fromConfigurationOptions配置,lifesture.Transient; } } 公共类邮件选项 { 公开邮寄选项 { 批量大小=1; } public int BatchSize{get;set;} 公共int BatchDelay{get;set;} } settings.json

{
  "mailing": {
    "batchSize": 15, 
    "batchDelay": 1
  }
}
然后我将它注入一个ViewModel:s构造函数,如下所示

公共类块视图模型 { 私人只读邮件选项_选项; 区域构造函数 公共区块视图模型选项 { _选项=选项.值; } 端区 } 运行它时,Container.Verify中会出现异常

OptionFactory类型的构造函数包含名为“setups”且类型为IEnumerable的参数,该参数未注册。请确保IEnumerable已注册,或更改OptionFactory的构造函数。但是,有一个IConfigureOptions的注册;你的意思是依赖于IConfigureOptions吗

堆栈跟踪:

在SimpleInjector.Container.ThrowParameterTypes上,必须注册TeredInjectionTargetInfo目标

如何注册IEnumerable?
有人能告诉我我做错了什么,或者更准确地说,我不明白的是什么吗?

简单的回答是:不要将IOption注入到应用程序组件中。如前所述,这只会使您的组件、它们的单元测试以及您已经注意到的配置变得复杂

相反,让BlockViewModel直接依赖邮件选项:

公共类块视图模型 { 私人只读邮件选项_选项; 公共区块ViewModelMailingOptions选项 { _选项=选项??抛出新参数NullExceptionNameOfOptions; } } 这允许您将配置简化为以下内容:

容器=新容器; var configuration=new ConfigurationBuilder .SetBasePathPath.CombineAppodomain.CurrentDomain.BaseDirectory,配置 .AddJsonFilesettings.json,可选:false; 建筑 MailingOptions=configuration.GetSectionmailing.Get; Container.RegisterInstanceoptions; //注册视图模型 容器。登记; 容器。验证;
简单的回答是:不要将IOption注入到应用程序组件中。如前所述,这只会使您的组件、它们的单元测试以及您已经注意到的配置变得复杂

相反,让BlockViewModel直接依赖邮件选项:

公共类块视图模型 { 私人只读邮件选项_选项; 公共区块ViewModelMailingOptions选项 { _选项=选项??抛出新参数NullExceptionNameOfOptions; } } 这允许您将配置简化为以下内容:

容器=新容器; var configuration=new ConfigurationBuilder .SetBasePathPath.CombineAppodomain.CurrentDomain.BaseDirectory,配置 .AddJsonFilesettings.json,可选:false; 建筑 MailingOptions=configuration.GetSectionmailing.Get; Container.RegisterInstanceoptions; //注册视图模型 容器。登记; 容器。验证;