从模型读取文件 asp.net 核心 1.1



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

wwwroot/keywords

/keywords.json.

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

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

我在传递hostingEnvironment的控制器中调用我的类,但我想分离这种行为,因为我需要在控制器外部实例化这个类。 例如:

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(@"..wwwrootkeywordskeywords.json")`;

文件 var 不会读取我的开发计算机中的项目文件夹。我想读取表单的路径类似于 E:\SOLUTION_FOLDER\PROJECT_FOLDER\wwwroot\关键字,但它从 E:\SOLUTION_FOLDER\wwwroot\关键字读取,并且不包括项目文件夹。

编辑 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 文件中执行此操作,因此如果我添加一些值,我不必编译项目。 从我在这里读到的内容来看,依赖注入负责实例化你的类,你不能在你的构造函数中有没有默认值的参数。 我需要(不需要,但这对我来说是更合理的方法(自己实例化这个类。也许在控制器外部的另一个类中实例化这个类。因此,我唯一想要的是可以访问 Web 根文件夹wwwroot(或其他文件夹(,我可以在其中放置此 json 文件,并且它必须在我的机器和服务器中工作。我可以将哪些path传递给System.IO.File.ReadAllText(path)才能读取此文件?

ASP.NET Core 为此类情况提供文件提供程序。在您的方案中,您需要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("keywordskeywords.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); 
}
}

最新更新