ビジネスレイヤーはビューにパスを取得しようとしてはいけません。そのようなパスで作業する必要がある場合は、それらを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に強力に結合されなくなりました。
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フレームワークを設定することです:
もう一つの可能性は、ビジネス層は、コンストラクタの引数として、アプリケーションのベース物理パスを取ることですあなたのビジネス層。
UPDATE:@jgauffinはコメント欄で指摘したように、それもファイルに依存しないように、このコードは、さらにビジネス層にStream
またはStreamReader
を渡すことによって改善することができます。これにより、再利用と単体テストの完全な分離がさらに容易になります。
ActionMailer.NETを評価しましたか?これは一見価値があり、NuGet経由でインストールすることができます。 https://bitbucket.org/swaj/actionmailer.net/wiki/Home –
ありがとう、私はこれのスタンドアロンバージョンを調べるつもりです。また、私は興味深いRazorEngineを使用していることを実際に読んだ。リンクありがとう! –