首页 文章

在.NetCore库中使用IHostingEnvironment

提问于
浏览
6

我用 Asp.net core 构建了一个应用程序,我为单元测试创建了一个 .Net core class library ,我想在我的库中使用 IHostingEnvironment (用于获取文件的物理路径),所以我将它添加到我的Asp.net核心应用程序服务的startup.cs中:

services.AddSingleton<IHostingEnvironment>();

在库中我添加了对我的Asp.net应用程序的引用,并在我的库中的类我写道:

private IHostingEnvironment _env;
    public Class1(IHostingEnvironment env)
    {
        _env = env;
    }

但是当我运行它时,它给了我这个错误:

以下构造函数参数没有匹配的fixture日期:IHostingEnvironment env

问题是什么?我如何在 .NetCore library 中使用它?

编辑:我也这样使用:

IServiceCollection services = new ServiceCollection();
        services.AddSingleton<IHostingEnvironment>();
        IServiceProvider provider = services.BuildServiceProvider();
        IHostingEnvironment service = provider.GetService<IHostingEnvironment>();
        var p = service.WebRootPath; // give this error: Cannot instantiate implementation type 'Microsoft.AspNetCore.Hosting.IHostingEnvironment' for service type 'Microsoft.AspNetCore.Hosting.IHostingEnvironment'

但它也不起作用 .

3 回答

  • 2

    我在此结束时提供参考说明 .

    如果您在类库中定位 netstandard (netstandard2.0),请从NuGet添加Microsoft.Extensions.Hosting.Abstractions以获取IHostingEnvironment接口而不进行任何实现 .

    我知道问题指明.net核心,无论如何..可能会帮助那些我在哪里 .

  • 2

    注意: services.AddSingleton<IHostingEnvironment>(); 表示您在单独作用域中注册 IHostingEnvironment 作为 IHostingEnvironment 的实现(始终重用) .

    由于无法创建接口实例,因此会出现此错误 .

    解决方案

    定义要创建的类(实现 IHostingEnvironment ),例如:

    services.AddSingleton<IHostingEnvironment>(new HostingEnvironment());
    

    幕后制作dotnet核心(托管nuget包)

    WebHostBuilder 构造函数的第一行是:

    this._hostingEnvironment = (IHostingEnvironment) new HostingEnvironment();
    

    此主机环境稍后由webhost构建器填充更多设置 .

    您应该查看他们的github页面或反编译源:https://github.com/aspnet/Hosting

    注意: HostingEnvironment 的大部分属性/设置都在 WebHostBuilderBuild() 方法上设置 . 如果你想自己进行moq /测试,你应该自己设置这些属性,或者在测试中也包含 WebHostBuilder .

  • 0

    对于我的.net类库,我所要做的就是为2.1.0版安装以下nuget包:

    Microsoft.AspNetCore.Hosting.Abstractions https://www.nuget.org/packages/Microsoft.AspNetCore.Hosting.Abstractions/

    然后我只是将IHostingEnvironment注入我的构造函数中 .

    我甚至不需要修改Startup.cs

相关问题