访问ConfigureServices中的IApplicationEnvironment

时间:2015-06-26 06:07:51

标签: c# asp.net-core

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

目前我通过获取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

3 个答案:

答案 0 :(得分:12)

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

public class Startup
{
    private readonly IApplicationEnvironment _appEnv;

    public Startup(IApplicationEnvironment appEnv)
    {
        _appEnv = appEnv;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        string basePath = _appEnv.ApplicationBasePath;
    }
}

答案 1 :(得分:1)

如何在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

答案 2 :(得分:0)

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

更多部门......

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

显然,实现者的决定是改变应用程序环境的视图:它不提供任何服务,它是一个共享信息。使用它的唯一方法是上面的那个。

还有更多......

IApplicationEnvironment神奇地消失了,因为事实证明ApplicationEnvironment不是预期会针对不同操作系统进行DI-ed或重新实现的服务,并且可能从这一点开始, ApplicationEnvironment什么都不实现。 非常好!