在.NetCore库中使用IHostingEnvironment

时间:2016-12-27 09:02:40

标签: asp.net-core

我用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'

但它也不起作用。

5 个答案:

答案 0 :(得分:3)

注意: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的大多数属性/设置都是在Build()的{​​{1}}方法上设置的。如果你想自己进行moq /测试,你应该自己设置这些属性,或者只在测试中包含WebHostBuilder

答案 1 :(得分:2)

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

  

Microsoft.AspNetCore.Hosting.Abstractions

     

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

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

我甚至不需要修改Startup.cs

答案 2 :(得分:0)

我在这里结束时的参考注释。

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

我知道问题仍然是.net核心。..可能会帮助那些人。我。

答案 3 :(得分:0)

尝试一下,它很简单

private IHostEnvironment env;
public Startup(IHostEnvironment env)
{
    this.env = env;
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHostEnvironment>(env);
}

然后您可以在课堂上使用它

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

希望它能完成工作^ _ ^

答案 4 :(得分:0)

这在.net核心类库和控制台应用程序中都对我有用:

使用参考

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Internal;

添加DI注册,

services.AddSingleton<IHostingEnvironment, HostingEnvironment>();
相关问题