目前我知道,對於MVC應用程序,視圖應該由ViewModel填充,控制器應該保持苗條,並且您不應該直接將實體框架實體直接暴露給控制器。對於一個小的MVC應用程序,你如何填充DTO和ViewModels?
在哪裏我陷入困境,是在哪裏把模型(從數據庫)的功能,並將其轉換爲ViewModel數據。
此刻我有一個實體表示數據庫中的一系列任務。這是該類:
public class Task
{
public int ID { get; set; }
public string Name { get; set; }
public Contact Contact { get; set; }
public string Description { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
public int? QuotedHours { get; set; }
public int? UsedHours { get; set; }
public virtual ICollection<Attachment> Attachments { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
public virtual Status Status { get; set; }
public int RecoveryStatusID { get; set; }
public virtual RecoveryStatus RecoveryStatus { get; set; }
}
我有一個DTO類看起來完全一樣,但使用列表而不是虛擬ICollections。它看起來像這樣:
public class Task
{
public int ID { get; set; }
public string Name { get; set; }
public Contact Contact { get; set; }
public string Description { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
public int? QuotedHours { get; set; }
public int? UsedHours { get; set; }
public List<Attachment> Attachments { get; set; }
public List<Comment> Comments { get; set; }
public virtual Status Status { get; set; }
public int RecoveryStatusID { get; set; }
public RecoveryStatus RecoveryStatus { get; set; }
}
然後,我有,我想填充視圖模型。
public class TaskIndexViewModel
{
public string CategoryName { get; set; }
public List<DTO.Task> Tasks { get; set; }
}
所以:
如何映射EF實體到DTO?我認爲它涉及使用Linq Select語句。我非常喜歡使用像AutoMapper這樣的東西,但我無法圍繞它的工作方式包裝頭(很多文檔已過時,似乎主要關注舊的靜態實現,顯然它已更新爲基於實例執行?)
一旦我在DTO中有數據,那麼翻譯從DTO到哪裏進入TaskIndexViewModel類?我知道這將涉及Linq GroupBy聲明,還有Select語句將它放入一個新List中,但這種邏輯應該放在哪裏?我想創建一個新的服務文件夾,並把這種功能放在那裏,但我覺得髒在控制器中實例化新對象,然後調用這個新類的函數。除非這不是一件壞事?
任何幫助,將不勝感激:)
爲什麼你需要有一個DTO和一個實體類?他們可以很容易地相同...您當前的實體類也可以用作DTO。 – raykrow
我認爲這是糟糕的形式,直接傳遞實體到視圖?由於EF延遲加載並最終產生了EF代理......(我可能有一些單詞錯誤) –
您的權利是您不想將原始實體類傳遞給視圖,但這就是爲什麼您在它們進入視圖之前將它們映射到視圖模型。我不認爲單獨的DTO和實體類是'錯誤',但我認爲這是不必要的。 – raykrow