从模型asp.net核心1.1

时间:2017-07-21 09:00:23

标签: c# asp.net-core

我需要从Asp.net Core 1.1中的类中读取一个json文件。该文件位于我的mvc项目的“wwwroot”中。 我知道我可以在控制器中依赖注入IHostingEnvironment,将其传递给我的类,并访问WebRootPath,但我希望能够在控制器外部实例化我的类,例如,在另一个类中。 如何读取我班级内的wwwroot文件夹中的文件? 目标文件夹示例:

  

的wwwroot /关键字/ keywords.json。

如果我尝试在我的类的构造函数中注入IHostingEnvironment,我将需要在实例化我的类时传递一个HostingEnvironment实例。

public class AppTweet
{
  private readonly IHostingEnvironment _hostingEnvironment;
  public AppTweet(ITweet tweet, ICollection<string> keyWords, IHostingEnvironment hostingEnvironment)
  {
     _hostingEnvironment = hostingEnvironment;
  }
}

我在一个向下传递hostingEnvironment的控制器中调用我的类,但是我想要解除这种行为,因为我需要在控制器外部实例化这个类。 E.g:

public class Article()
{
  public Article()
  {
    var appTweet = new AppTweet(new Tweet(), new List<string>, new HostingEnvironment()); 
  }
}

如果我这样做,HostingEnvironment.WebRootPath为空

修改

也许我不需要依赖注入。我只想读取wwwroot文件夹中的文件,但我不知道如何在开发和服务器中访问此路径 当我尝试

`var file = System.IO.File.ReadAllText(@"..\wwwroot\keywords\keywords.json")`;

文件var不读取我的开发机器中的项目文件夹。我想要阅读的路径类似于E:\ SOLUTION_FOLDER \ PROJECT_FOLDER \ wwwroot \ keywords,但它从E:\ SOLUTION_FOLDER \ wwwroot \ keywords中读取,并且不包含项目文件夹。

编辑2

我认为DI不适合这种情况。 这是我自己的个人项目。我要做的是在这个类中填充一些属性。例如:我班上的总结:

public class AppTweet
{
  public AppTweet (ITweet tweet, ICollection<string> keyWords)
  {
    //Read a json file from wwwroot and populate NotDesiredKeyWords property
  }
  [NotMapped]
  public IEnumerable<string> NotDesiredKeyWords { get; set; }
 }

此类AppTweet必须能够访问此json文件,就像配置文件一样,因为它始终必须读取这些值。我知道我可以硬编码类中的值(它会更快),但我更喜欢在json文件中执行它,所以如果我添加一些值,我不必编译项目。 从我能读到的here开始,依赖注入负责实例化你的类,你的构造函数中没有没有默认值的params。 我需要(不需要,但这是更合理的方式)我自己实例化这个类。也许可以在控制器外部的另一个类中实例化这个类。因此,我唯一想要的是访问我可以放置此json文件的Web根文件夹wwwroot(或其他文件夹),它必须在我的机器和服务器中都可以工作。哪个path我可以传递给System.IO.File.ReadAllText(path)以便阅读此文件?

1 个答案:

答案 0 :(得分:1)

ASP.NET Core为此类案例提供File Provider。在您的方案中,您需要PhysicalFileProvider类的实例(它用于访问系统的实际或物理文件)。它可以直接创建为

IFileProvider provider = new PhysicalFileProvider("root path");

或者您需要访问wwwroot中的文件,可以使用IHostingEnvironment.WebRootFileProvider扩展程序属性:

//
// Summary:
//     /// Gets or sets an Microsoft.Extensions.FileProviders.IFileProvider pointing
//     at Microsoft.AspNetCore.Hosting.IHostingEnvironment.WebRootPath. ///
IFileProvider WebRootFileProvider { get; set; }

如何阅读文件的可能方式:

// using System.IO;
// using Microsoft.AspNetCore.Hosting;

// IHostingEnvironment env
...

var fileProvider = env.WebRootFileProvider;

// here you define only subpath
var fileInfo = fileProvider.GetFileInfo("keywords\keywords.json"); 

var fileStream = fileInfo.CreateReadStream();

using (var reader = new StreamReader(fileStream))
{
    string data = reader.ReadToEnd();
}

另请注意,您需要添加Microsoft.Extensions.FileProviders.Physical包作为依赖项。

如果你想手动创建实例,那么你需要以级联方式传递依赖...(并且应该以相同的方式创建YourService的实例,或者通过构造函数将其作为依赖项传递到另一个类中使用DI ...)

public class YourService
{
    private IHostingEnvironment _env;

    public YourService(IHostingEnvironment env)
    {
        _env = env;
    }
    public Article CreateArticle()
    {
        return new Article(_env);
    }
}

public class AppTweet
{
  public AppTweet(ITweet tweet, ICollection<string> keyWords, IHostingEnvironment hostingEnvironment)
  {
     // read file here for example
  }
}

public class Article()
{
  public Article(IHostingEnvironment hostingEnvironment)
  {
    var appTweet = new AppTweet(new Tweet(), new List<string>, hostingEnvironment); 
  }
}