中擴展具有功能的實體模型是否合法,首先這是我的情況。我正在使用ASP.NET MVC 3和Entity Framework 4.1編寫Intranet應用程序。我的應用程序是使用「工作單元」和「存儲庫」設計模式開發的。在ASP.NET MVC
在我看來,它應該如此,我的應用程序有一個工作單元,它提供了對所有存儲庫的集中訪問,這些存儲庫進一步提供對實體的訪問。
假設我有一個名爲「ProductApprovalDocument」的實體,其存儲在數據庫中的屬性爲「id」,「creationDate」和「approvalDecission」。現在我希望用戶能夠訪問該實體即將描述的文檔的PDF文件。由於這些文件使用URL格式「[fileServerDirectoryPath]/[ProductApprovalDocument.id] .pdf」存儲在文件服務器上的中央目錄中,因此我不想爲數據庫上的該文件路徑另存一個屬性。我想要做的是給實體一個名爲「filepath」的額外屬性,該屬性自動構造具有給定信息的路徑並返回它。
現在的問題:
我使用所謂的FileService從應用程序的其他抽象文件訪問的接口。現在在我的情況下,我將不得不從實體模型中訪問UnitOfWork對象,以檢索當前的FileService實現並獲取預配置的文件路徑。我認爲這是完全錯誤的方式,因爲對於我來說,一個實體模型應該只能作爲數據容器使用,而不會更多或更少。
現在的問題:
我該如何處理這種情況。我不想總是通過控制器設置filepath屬性,因爲它或多或少是靜態的,因此可以通過模型以某種方式自動完成。
編輯(最終的解決方案):
感謝安德烈·洛克的答案,我獲得了另一種觀點認爲,以我的問題。
- 我想達到的中心目標是什麼?
- 我希望用戶能夠訪問存儲在文件服務器上的文件。
- 我是否必須爲每個顯示的實體提供總文件路徑?
- 不!想想MVC的原理!控制器及時處理用戶操作。您不必提供信息,直到它真的被使用。
因此解決的辦法就是要呈現的數據和往常一樣,但不是顯示一個靜態的HTML鏈接的文件,你必須包括一個ActionLink的到即時計算並自動將文件路徑控制器將用戶重定向到文件。
在視圖做到這一點:
@Html.ActionLink(Model.ID.ToString(), "ShowProductApprovalDocumentFile", "ProductApprovalDocument", new { ProductApprovalDocumentID = Model.ID }, null)
,而不是這樣的:
<a href="@Model.FilePath">@Model.ID</a>
而一個相應的操作添加到控制器:
public ActionResult ShowProductApprovalDocumentFile(int ProductApprovalDocumentID)
{
return Redirect(_unitOfWork.FileService.GetFilePathForProductApprovalDocument(ProductApprovalDocumentID));
}
由於這一帶的傢伙給我一個答案的時候,並特別感謝安德烈誰讓我滿意的答案! :)
我不確定我是否正確理解您的問題。 FileService是什麼?它是否用於從文檔ID生成文件路徑?或者它用於實際檢索文件?它與工作單位有什麼關係? – 2012-03-01 09:27:04
FileService用於通過mvc應用程序進行一般文件系統訪問,例如,根據實現類型訪問,存儲和/或自動版本控制文件。換句話說,我的應用程序比我在這裏描述的要複雜得多。 是的,我也用它來生成文件路徑,授予一箇中心位置,以便爲將來的變化提供靈活性 – 2012-03-01 09:33:15