3

可以說我有以下實體映射到數據庫表(所有匹配的屬性名可以被認爲是PK/FK關係):如何連接控制器到服務層到庫層

public class Person 
{ 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Employee 
{ 
    public int EmployeeID { get; set; } 
    public int PersonID { get; set; } 
    public int Salary { get; set; } 
} 

public class Executive 
{ 
    public int ExecutiveID { get; set; } 
    public int EmployeeID { get; set; } 
    public string OfficeNumber { get; set; } 
} 

public class Contact 
{ 
    public int ContactID { get; set; } 
    public int PersonID { get; set; } 
    public string PhoneNumber { get; set; } 
} 

我的架構如下:控制器調用服務層其中要求層。

我有一個視圖,名爲AddExecutive,它收集以下信息:FirstName, LastName, PhoneNumber, SalaryOfficeNumber

根據我的架構提交這些數據的最佳方式是什麼?我在想我,我會發布了一個包含所有我收集,將其傳遞給服務方法AddExecutive(AddExecutiveViewModel addExecutiveViewModel),那麼服務方法中我會創造的Person, Employee, Executive,Contact新實例,並將它們連接到對方的信息視圖模型(Person對象)並將所有數據傳遞給Repository方法AddExecutive(Person person)。存儲庫方法然後將簡單地提交數據。這聽起來是對的嗎?什麼會是更好的解決方案?

回答

2

只要你保持好的關注點分離。 控制器:數據綁定到服務/模型 服務:強制執行業務邏輯,手持久性回購 回購:執行ACID事務和查詢。

如果您的視圖模型是由任何形式的框架擔憂(即:一個POCO)脫鉤,因爲你保持你的可測試性應該是不錯的。

+0

我主要關心儘可能的關注點分離而言(嘿嘿),是我是否應該爲每個實體或不服務和信息庫。爲什麼我只能擁有行政服務和存儲庫?是否因爲其他實體可以鏈接在一起? – 2010-10-27 03:15:32

+4

編號服務具有功能問題。 (基本上每個用戶案例的一種方法,大體上來說)。一個服務將信息作爲輸入,無論你是通過基元來完成,還是由自定義類取決於你。如果使用自定義類,請確保它保持在消息中,I.E .:不要使用大的狀態包來傳遞參數。 – Slappy 2010-10-27 03:21:32

+0

你會考慮我上面描述爲「大OL狀態包」的AddExecutiveViewModel嗎? – 2010-10-27 03:31:13

0

當您談論提交數據時,您正在談論一個工作單元。所以,從這裏開始:

public ActionResult AddExecutive(AddExecutiveViewModel addExecutiveViewModel) 
{ 
    // simplified; no error handling 
    using (var uow = new UnitOfWork()) // or use constructor injection on the controller... 
    { 
     // ??? 
     uow.Commit(); 
    } 
    return RedirectToAction(// ... 
} 

現在你的服務出來工作單位的(因爲工作的兩個單元和存儲庫共享在後臺ObjectContext; ObjectContext是EF的「原生」的工作單位)。因此,我們可以在// ???填寫:

public ActionResult AddExecutive(AddExecutiveViewModel model) 
{ 
    // simplified; no error handling 
    using (var uow = new UnitOfWork()) // or use constructor injection on the controller... 
    { 
     uow.EmployeeService.AddExecutive(model); 
     uow.Commit(); 
    } 
    return RedirectToAction(// ... 
} 

uow.Commit()是圍繞ObjectContext.SaveChanges()薄殼。工作單元注入與庫相同的ObjectContext。這些服務是EF無知的。

對於工作(雖然在早期階段)例如,看到我的開源庫/服務項目,Halfpipe