【问题标题】:Creating IWebHostEnvironment manually asp.net core 3.1手动创建 IWebHostEnvironment asp.net core 3.1
【发布时间】:2020-03-27 09:35:42
【问题描述】:

在 asp.net core 2.1 中,我可以像这样创建 IHostingEnvironment

public IHostingEnvironment CreateHostingEnvironment()
{
    var hosting = new HostingEnvironment()
    {
       EnvironmentName = "IntegrationTests"
    };
    return hosting;
}

在 Asp.net core 3.1 中它已更改为 IWebHostEnvironment,但我需要以类似的方式创建它。可能的目标是创建这个对象并设置环境名称。

public IWebHostEnvironment CreateWebHostEnvironment()
{
    var host = new WebHostEnvironment(); // ???
}

【问题讨论】:

  • 在 ASP.NET Core 3.x 中是 internal。根据您的用例,您可能应该考虑创建自己的类来实现相同的接口。
  • @mm8,这是旧的 2.1 类。新的是this one
  • 您已链接到界面。我已经链接到内部的实现。内部类实现IWebHostEnvironment
  • @DeivydasVoroneckis 请描述一下你想要实现什么,也许你不需要创建这个类的实例。

标签: c# .net asp.net-core asp.net-core-3.1


【解决方案1】:

IWebHostEnvironment 接口的唯一内置implementation 在 ASP.NET Core 3.x 中是内部的:

internal class HostingEnvironment : IHostingEnvironment, Extensions.Hosting.IHostingEnvironment, IWebHostEnvironment
{
    public string EnvironmentName { get; set; } = Extensions.Hosting.Environments.Production;

    public string ApplicationName { get; set; }

    public string WebRootPath { get; set; }

    public IFileProvider WebRootFileProvider { get; set; }

    public string ContentRootPath { get; set; }

    public IFileProvider ContentRootFileProvider { get; set; }
}

因此,如果您出于某种原因需要创建实现接口的类的实例,您基本上可以将上述代码复制到您的项目中,并可能更改类的名称。然后,您可以根据自己的要求创建它的实例。

无论如何,框架只依赖于接口。

【讨论】:

  • 难道不能通过类似program.cs文件中的一些类似的构建方法来创建一个真正的Hosting环境类吗? Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });这是用于集成测试,所以我对实际实现没问题
  • 不,无论如何都要使用反射。但是创建HostingEnvironment 的实例无济于事。 ASP.NET Core 支持使用测试 Web 主机和内存中测试服务器进行集成测试,如 docs 中所述。
  • 好的,谢谢。然后我将简单地模拟界面。
  • 谢谢,这解决了我遇到的特定问题。我只需要实例化一个“虚拟”HostEnvironment,以便我可以在控制台应用程序中使用剃须刀服务。
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 2020-06-15
  • 1970-01-01
  • 2021-06-25
  • 2020-11-27
  • 2021-07-05
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多