您的業務層不應試圖獲取視圖的路徑。如果它需要使用這樣的路徑,它們應該作爲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);
...
}
}
,然後所有剩下的是配置DI框架傳遞HostingEnvironment.ApplicationPhysicalPath
屬性值實例化時您的業務層。
更新:由於@jgauffin在評論部分中指出該代碼可以通過傳遞Stream
或StreamReader
到業務層可以進一步改進,使之甚至不依賴於文件。這將使它更容易重用和單元測試完全隔離。
你評價過ActionMailer.NET嗎?值得一看,可以通過NuGet安裝。 https://bitbucket.org/swaj/actionmailer.net/wiki/Home – 2012-04-13 01:56:03
謝謝,我打算看看這個獨立版本。實際上我也讀過它使用RazorEngine,這很有趣。感謝您的鏈接! – 2012-04-13 23:41:02