【问题标题】:Access IApplicationEnvironment in ConfigureServices在 ConfigureServices 中访问 IApplicationEnvironment
【发布时间】:2015-06-26 06:07:51
【问题描述】:

在我的ConfigureServices 方法中,我想读取一个文件(在我的例子中是用于签署令牌的证书,但它可以是设置服务所需的任何文件)。因此我需要从IApplicationEnvironment 中知道ApplicationBasePath

目前我通过像这样获取IApplicationEnvironment 服务来解决问题:

public void ConfigureServices(IServiceCollection services)
{
    ...
    string basePath;
    var serviceProvider = services.BuildServiceProvider();
    try
    {
        basePath = serviceProvider.GetRequiredService<IApplicationEnvironment>().ApplicationBasePath;
    }
    finally
    {
        (serviceProvider as IDisposable)?.Dispose();
    }
    ...
}

这种方法有效,但我不确定这是否是正确的方法。所以我的问题是:

  1. 有没有更好的方法来读取ConfigureServices中的文件?
  2. 有没有更好的方法来获取ConfigureServices 中的应用程序基路径?
  3. 如果我的方法正确,我是否正确处理IDisposable

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    运行时允许在Startup类的构造函数中进行依赖注入:

    public class Startup
    {
        private readonly IApplicationEnvironment _appEnv;
    
        public Startup(IApplicationEnvironment appEnv)
        {
            _appEnv = appEnv;
        }
    
        public void ConfigureServices(IServiceCollection services)
        {
            string basePath = _appEnv.ApplicationBasePath;
        }
    }
    

    【讨论】:

      【解决方案2】:

      DNX 1.0.0-rc1-15996发布后如何获取IApplicationEnvironment实例

      要获得对IApplicationEnviroment 接口实现者的引用,您可以使用PlatformServices.Default.Application

      以下示例在项目的 Startup.cs 文件的上下文中显示了这一点:

      using Microsoft.Extensions.PlatformAbstractions;
      
      namespace MyWebApp
      {
          public class Startup
          {       
              private IApplicationEnvironment _appEnv { get; set; }
      
              public Startup(IHostingEnvironment env)
              {
                  // Set up configuration sources.
                  var builder = new ConfigurationBuilder()                
                      .AddJsonFile("appsettings.json")
                      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false);
      
                  if (env.IsDevelopment())
                  {
                      // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
                      builder.AddUserSecrets();
                  }
      
                  builder.AddEnvironmentVariables();          
                  Configuration = builder.Build();
      
                  // obtain IApplicationEnvironment instance
                  _appEnv = PlatformServices.Default.Application;
      
              }
      ...
      

      以下行显示了如何使用该实例来获取应用程序的基本路径:

       string basepath = _appEnv.ApplicationBasePath
      

      参考资料:

      1. Refactoring DNX not to inject into Program constructors #2990
      2. IApplicationEnvironment no longer injected in DNX command

      【讨论】:

        【解决方案3】:

        为什么不直接从PlatformServices.Default.Application.ApplicationBasePath 分配路径?正如名称Default 所暗示的那样(不是一个规则,因为这里和那里也使用Current),它是PlatformServices 类型的静态成员。

        更多部门...

        除了DefaultApplication 类型为ApplicationEnvironment 是该类公开的唯一属性。这是合理的,因为ApplicationEnvironment 只是封装了一些关于正在运行的应用程序(或应用程序,无论它们有多少)的信息。同样重要的是,类的默认 ctor 是 private。闻起来像辛格尔顿,嗯?

        显然,实现者的决定是改变对应用程序环境的看法:它没有任何作用,它是一个共享信息。使用它的唯一方法是上述方法。

        还有更多...

        IApplicationEnvironment 神奇地消失了,再次因为事实证明ApplicationEnvironment 不是一个预期会为不同操作系统进行 DI 编辑或重新实现的服务,也许从此时起,ApplicationEnvironment 实现没有。 非常好!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-06
          • 2020-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-12
          • 2021-01-06
          • 1970-01-01
          相关资源
          最近更新 更多