ビジネス層は、ビューへのパスを取得しようとすべきではありません。そのようなパスで動作する必要がある場合は、UI レイヤーから引数として渡す必要があります。
したがって、これを使用する代わりに、ビジネスレイヤーで:
public class MyBusiness : IMyBusiness
{
public string RenderView()
{
string _template = File.ReadAllText(@"Views/emails/registrationconfirmation.cshtml");
...
}
}
あなたはこれを持つことができます:
public class MyBusiness
{
public string RenderView(string viewPath)
{
string _template = File.ReadAllText(viewPath);
...
}
}
適切なパス (ASP.NET アプリケーションの場合はServer.MapPath
関数を使用して取得でき、デスクトップ アプリケーションの場合は相対パスである可能性があります) を渡すことを処理するのは、コントローラーにある呼び出しコードの責任です。パスなど)。このようにして、ビジネス層は ASP.NET に強く結合されなくなります。
もう 1 つの可能性は、ビジネス レイヤーがアプリケーションの基本物理パスをコンストラクター引数として取得することです。
public class MyBusiness : IMyBusiness
{
private readonly string _basePath;
public MyBusiness(string basePath)
{
_basePath = basePath;
}
public string RenderView()
{
var file = Path.Combine(_basePath, @"Views\emails\registrationconfirmation.cshtml");
string _template = File.ReadAllText(viewPath);
...
}
}
あとはHostingEnvironment.ApplicationPhysicalPath
、ビジネス レイヤーをインスタンス化するときにプロパティ値を渡すように DI フレームワークを構成するだけです。
更新: @jgauffin がコメント セクションで指摘したように、このコードは、ファイルに依存しないようにaStream
または aをビジネス レイヤーに渡すことでさらに改善できます。StreamReader
これにより、完全に分離した状態での再利用と単体テストがさらに容易になります。