我是ASP.NET Core的新手,需要一些指导。我试图找出一个简单的场景,使用ASP.NET Core中的应用程序设置,同时也使用Simple Injector。
我首先按照Rick Strahl的here解释设置我的强类型配置设置。这非常有效。
u=unique(A(:,2));
for i=1:size(u,1)
M=find(A(i,2)==u(i));
med(i)=median(A(M,1));
end
appsetting.json
public class MySettings
{
public string ApplicationName { get; set; }
}
Startup.cs
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"MySettings": {
"ApplicationName": "Test Service"
}
}
在我们的其他项目中,正在使用Simple Injector进行DI。添加Simple Injector包并按照说明进行配置后,我看到我的IOptions配置中断了。
我想知道的是,在ASP.NET Core中实现配置并使用另一个DI库(如Simple Injector)的最佳做法是什么?
答案 0 :(得分:3)
ASP.NET Core integration guide for Simple Injector声明如下:
ASP.NET Core包含基于
IOption<T>
抽象的新配置模型。我们建议不要将IOption<T>
依赖项注入您的应用程序组件。而是让组件直接依赖于配置对象并将它们注册为 Singleton 。这可确保在应用程序启动期间读取配置值,并允许在该时间点验证它们,从而使应用程序能够快速失败。让应用程序组件依赖于
IOptions<T>
有一些不幸的缺点。首先,它会导致应用程序代码对框架抽象采取不必要的依赖。这违反了依赖注入原则,该原则规定了应用程序定制抽象的使用。将IOptions<T>
注入应用程序组件只会使此组件更难以测试,同时不会带来任何好处。应用程序组件应该直接依赖于它们所需的配置值。
IOptions<T>
配置值被懒惰地读取。虽然可以在应用程序启动时读取配置文件,但只有在第一次调用IOptions<T>.Value
时才会创建所需的配置对象。当反序列化失败时,由于应用程序配置错误,只有在调用IOptions<T>.Value
后才会出现此类错误。这可能导致错误配置,以防止检测到的时间超过要求的时间。通过在应用程序启动时读取和验证配置值,可以防止此问题。配置值可以作为单例注入需要它们的组件中。更糟糕的是,如果您忘记配置特定部分(通过省略对
services.Configure<T>
的调用)或在检索配置部分时输入错误(通过向{{1提供错误的名称)配置系统只会为应用程序提供一个默认的空对象,而不是抛出异常!这在某些情况下可能有意义,但很容易导致脆弱的应用程序。由于您希望在启动时验证配置,因此延迟读取它是没有意义的,这使得将IOption注入组件中是完全错误的。取决于
Configuration.GetSection(name)
,在引导应用程序时可能仍然有用,但在其他任何地方都不是依赖。一旦你有一个正确读取和验证的配置对象,需要配置对象的组件的注册就像这样简单:
IOptions<T>
答案 1 :(得分:-1)
我是ExistAll.SimpleConfig的作者。 SimpleConfig正是DI环境中配置/设置所需的。
看看它是否是您需要的