我需要从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)
以便阅读此文件?
答案 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);
}
}