Asp.net Core 1.1のクラスからjsonファイルを読み込む必要があります。ファイルは私のmvcプロジェクトの "wwwroot"にあります。 コントローラにIHostingEnvironmentの依存性注入を行い、クラスに渡してWebRootPathにアクセスできることは知っていますが、別のクラスのように、コントローラの外部でクラスをインスタンス化できるようにしたいと考えています。 クラス内のwwwrootフォルダにあるファイルを読むにはどうすればよいですか? 宛先フォルダの例:モデルasp.netコア1.1のファイルを読み込みます。
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は
EDIT
たぶん私は依存性の注入を必要としないnullです。私はwwwrootフォルダ内のファイルを読みたいが、私は、ファイルvarがでプロジェクトフォルダを読み取らない
`var file = System.IO.File.ReadAllText(@"..\wwwroot\keywords\keywords.json")`;
をしようとすると、開発中に、サーバ の両方で、このパスにアクセスする方法がわかりません私の開発マシン。私がフォームを読みたいパスはE:\ SOLUTION_FOLDER \ PROJECT_FOLDER \ wwwroot \ keywordsですが、E:\ SOLUTION_FOLDER \ wwwroot \ keywordsから読み込み、プロジェクトフォルダは含まれていません。
EDIT 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を読むことができたので、Dependency Injectionがあなたのクラスをインスタンス化します。デフォルト値を持たないコンストラクタではparamsを持つことはできません。 私はこのクラスを自分でインスタンス化する必要はありませんが、それはもっと合理的な方法です。そして、おそらくこのクラスをコントローラの外の別のクラスの中でインスタンス化してください。だから、私が望む唯一のことは、このjsonファイルを置くことができるWebルートフォルダwwwroot
(または他のフォルダ)にアクセスすることだけで、マシンとサーバの両方で動作する必要があります。このファイルを読み取るためにはに私はpath
を渡すことができますか?
AppTweetが知る必要があるのは、パス自体または完全なファイル名を渡すだけではどうですか? –
またはAppTweetに 'Dependency Injection'を使用し、新しいものをインスタンス化する代わりに' HostingEnvironment'を渡してください。 –
@PeterB、開発と運用の両方で動作するパスをどのように渡すことができますか? var file = System.IO.File.ReadAllText(@ ".. \ wwwroot \ keywords \ keywords.json");を実行すると、パス内のプロジェクトフォルダがスキップされ、ソリューションフォルダが読み込まれます。私は生産でこれをテストしなかった。それは働くことができますか? – Porkopek