Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问ConfigureServices中的IApplicationEnvironment_C#_Asp.net Core - Fatal编程技术网

C# 访问ConfigureServices中的IApplicationEnvironment

C# 访问ConfigureServices中的IApplicationEnvironment,c#,asp.net-core,C#,Asp.net Core,在我的ConfigureServices方法中,我想读取一个文件(在我的例子中,是一个用于签名令牌的证书,但它可以是设置服务所需的任何文件)。因此,我需要从iaapplicationenvironment了解ApplicationBasePath 目前,我通过如下方式获得iaapplicationenvironment服务来解决问题: public void ConfigureServices(IServiceCollection services) { ... string b

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

目前,我通过如下方式获得
iaapplicationenvironment
服务来解决问题:

public void ConfigureServices(IServiceCollection services)
{
    ...
    string basePath;
    var serviceProvider = services.BuildServiceProvider();
    try
    {
        basePath = serviceProvider.GetRequiredService<IApplicationEnvironment>().ApplicationBasePath;
    }
    finally
    {
        (serviceProvider as IDisposable)?.Dispose();
    }
    ...
}
public void配置服务(IServiceCollection服务)
{
...
字符串基路径;
var serviceProvider=services.BuildServiceProvider();
尝试
{
basePath=serviceProvider.GetRequiredService().ApplicationBasePath;
}
最后
{
(serviceProvider作为IDisposable)?.Dispose();
}
...
}
这种方法有效,但我不确定这是否是正确的方法。因此,我的问题是:

  • ConfigureServices
    中是否有更好的读取文件的方法
  • ConfigureServices
    中是否有更好的方法获取应用程序基本路径
  • 如果我的方法正确,我是否正确处理
    IDisposable

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

    public class Startup
    {
        private readonly IApplicationEnvironment _appEnv;
    
        public Startup(IApplicationEnvironment appEnv)
        {
            _appEnv = appEnv;
        }
    
        public void ConfigureServices(IServiceCollection services)
        {
            string basePath = _appEnv.ApplicationBasePath;
        }
    }
    
    如何在DNX 1.0.0-rc1-15996发布后获取IApplicationEnvironment实例 要获取对
    iaapplicationviroment
    接口实现者的引用,可以使用
    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
    
    参考资料:


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

    部门的更多信息。

    除了
    Default
    ,类型为
    ApplicationEnvironment
    Application
    是该类公开的唯一属性。这是合理的,因为
    ApplicationEnvironment
    只是封装了一些关于正在运行的应用程序(或应用程序,不管它们可能有多少)的信息。同样重要的是,类的默认构造函数是
    private
    。闻起来像单身汉,是吗

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

    还有更多…

    iaapplicationenvironment
    神奇地消失了,这又是因为
    ApplicationEnvironment
    不是一种预期为不同的操作系统提供或重新实现的服务,也许从现在开始,
    ApplicationEnvironment
    就什么也没有实现<很好