我有這樣的4款車型 - 2個域模型和2層的DTO幫助改進(重構)我的代碼。 Automapper - EF - asp.net的MVC-3
public class Project
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
public class Task
{
public int ID { get; set; }
public virtual int ProjectID { get; set; }
public string Name { get; set; }
public virtual Project Project { get; set; }
}
public class ProjectDTO
{
[Required]
public string Name { get; set; }
public List<TaskDTO> Tasks { get; set; }
}
public class TaskDTO
{
[Required]
public string Name { get; set; }
public int ID { get; set; }
public bool MarkRemove { get; set; }
}
我的繼承人automapper配置
Mapper.CreateMap<Project, ProjectDTO>();
Mapper.CreateMap<ProjectDTO, Project>().ForMember(p =>p.ID, opt=>opt.Ignore()).ForMember(p=>p.Tasks, opt=>opt.Ignore());
Mapper.CreateMap<Task, TaskDTO>();
Mapper.CreateMap<TaskDTO, Task>().ForMember(task=>task.ProjectID, opt=>opt.Ignore()).ForMember(task=>task.Project, opt=>opt.Ignore());
我的繼承人HttpPost編輯操作
[HttpPost]
public ActionResult Edit(int id, ProjectDTO p)
{
if (ModelState.IsValid)
{
var dbProject = db.Projects.Where(pr => pr.ID == id).Single();
Mapper.Map(p, dbProject);
foreach (var task in p.Tasks)
{
Task dbTask;
try
{
dbTask = dbProject.Tasks.Where(t => t.ID == task.ID).Single();
}
catch
{
dbTask = new Task();
Mapper.Map(task, dbTask);
dbProject.Tasks.Add(dbTask);
}
if (task.MarkRemove)
{
db.Tasks.Remove(dbTask);
}
else {
Mapper.Map(task, dbTask);
}
}
db.Entry(dbProject).State = EntityState.Modified;
db.SaveChanges();
TempData["Success"] = "Modelo Valido";
return RedirectToAction("Index");
}
return View(p);
}
我不完全滿意這個,但我不認爲有一個更清潔的方法來處理這個有點複雜的場景......
現在,它是工作,我想至少重構這個使用存儲庫模式或東西的方式,控制器動作是不是令人費解的..這最終將產品代碼:■
可以人給我一些關於如何重構這個的建議? 請幫忙。
感謝您的非常全面的答案..唯一的是,我不僅RemovingTasks。我也在添加和更新它們......你會用同樣的方法來做這件事嗎? – ignaciofuentes
@NachoF的確如此。我沒有注意到這個重要的細節。我仍然會在單個服務方法(例如'UpdateTasks')中完成整個操作,但在這種情況下,除了需要移除的任務的ID列表之外,我們還需要傳遞要更新的任務列表。這個要更新的'Task'列表將使用視圖模型中的AutoMapper構造,完全如您在示例中所做的那樣:'var tasksToUpdate = new List(); Mapper.Map(p.Tasks,tasks);'。 –
這是令人困惑的原因,那麼我在DTO中添加的MarkRemove屬性會在映射中丟失...... UpdateTasks方法無法知道要刪除哪些任務。 – ignaciofuentes