如何使用Simple Injector使用ASP.NET Core App设置

时间:2017-02-02 21:43:13

标签: c# asp.net-core simple-injector

我是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)的最佳做法是什么?

2 个答案:

答案 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环境中配置/设置所需的。

看看它是否是您需要的