Wie verwende ich die Schnittstelle IHostingEnvironment
, ohne sie in einem Konstruktor zu initiieren?Verwendung von IHostingEnvironment
mein Startup.cs:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
Configuration = builder.Build();
}
Meine Klasse:
public class FileReader
{
// I don't want to initiate within a constructor
public string ReadFile(string fileName)
{
// this is wrong! how can I use it?
var filename = Path.Combine(IHostingEnvironment.WebRootPath, fileName);
}
}
Wenn ich 'IHostingEnvironment' im Konstruktor verwende, wie kann ich die Klasse FileReader initiieren? var fileReader = neuer FileReader(); Es erwartet "IHostingEnvironment" als Parameter. – Eyal
Sie instanziieren es nicht, Sie fordern es über Konstruktor an. Wenn Sie DI/IoC verwenden, sollten Sie es ** überall ** verwenden. Wenn Sie es also in der Steuerung brauchen, sieht Ihr Controller-Konstruktor etwas wie 'public MyController (FileReader fileReader)' aus, dann behalten Sie einen Verweis darauf und greifen in der Aktion darauf zu. Wenn du DI benutzt, nennst du niemals 'new' auf deinen Diensten (nur Modelle und bestimmte Framework-Klassen nicht über DI kontrolliert/aufgelöst) – Tseng
Aber du solltest es in eine Schnittstelle aufteilen, die' IFileReader' und 'FileReader' hat und nur die Schnittstelle injiziert . Wenn Sie Unit-Tests schreiben, können Sie die Oberfläche leicht verspotten, was mit 'FileReader' nicht möglich ist. – Tseng