2017-10-13 102 views
0

我試圖在Winform中首次實現此體系結構。所以我對我有一個簡單但非常重要的問題。 舉一個簡單的例子。我希望表單能夠檢索用戶列表並允許修改電話號碼。 我有這樣的第一步驟(簡化和我通常使用的接口)Winform應用程序中的3層體系結構

public Form1() 
{ 
    InitializeComponent(); 
    UserService _userService = new UserService(); 
    listBoxUsers.DataSource = _userService.GetAllUsers(); 
} 
class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Phone { get; set; } 
} 
class UserService 
{ 
    UserRepository _userRepository=new UserRepository(); 
    public Dictionary<int, string> GetAllUsers() 
    { 
     DataTable dtbl= _userRepository.AllUsers(); 
     //Some code here 
     return dict; 
    } 
} 
class UserRepository 
{ 
    public DataTable AllUsers() 
    { 
     //Sql query 
     return dtbl; 
    } 
} 

現在通過選擇lisbox用戶,我能夠顯示一些信息作爲電話號碼。當我更改電話號碼時,我需要一個名爲UpdatePhoneNumber的方法來更新SQL數據庫。 但是,它放在哪裏? User或UserService(我不談論SQL查詢,只是邏輯) 然後,如何訪問(此處或應用程序中的其他位置)此用戶屬性以將其顯示在表單中?直接使用_user.Id(用戶必須在表單中實例化)或實現一個_userService。檢索User.ID的id(在這種情況下,Form只知道UserService類)。 非常感謝您的寶貴幫助

+1

爲什麼'GetAllUsers()'返回'Dictionary '?我期望有一個「字典」(或者甚至只是一個「IEnumerable 」)。 'User'就是*數據傳輸對象。因此,當您更改電話號碼*或任何其他屬性*時,只需在DTO中更改它,然後在服務和存儲庫中使用類似「更新(用戶用戶)」的方法。負責檢查是否有任何更改以及存儲庫實際將更改寫入數據庫(或任何類型的存儲)的服務。 – Corak

回答

0

將在用戶類中的用戶數據工作的所有方法。問自己這個問題用戶可以做什麼?將用戶控制在UserService中的所有邏輯,如GetUserById,GetAllUsers,CreateUser等.. 將用戶可以在User類中執行的所有方法。 或者最近我正在構建這樣的事情,我將User和UserServices合併爲一個,並使UserServices類方法爲靜態,這樣我就可以在沒有用戶實例的情況下訪問它們。

希望得到這個幫助。

+0

「合併」「用戶」和「用戶服務」與將邏輯分成層的意圖完全相反。它也違反[單一責任原則](https://en.wikipedia.org/wiki/Single_responsibility_principle)([SOLID]中的「S」(https://en.wikipedia.org/wiki/SOLID_(object- oriented_design))) – Corak

+0

只對大型項目有意義,它仍然不違反Single Resp Principle cuz與用戶邏輯有關的所有內容都在用戶中。 –

+0

聽起來像OP想要「進入」分層體系結構,首先將其應用於小型測試應用程序,以瞭解什麼可行,哪些不可行,然後可能稍後將其用於大型項目。有一個對象負責它自己的檢索/持久性**是違反SRP的。你沒有一個「App」類,並把所有內容放在那裏,只是因爲它「與應用邏輯有關」。 – Corak

0

這是您的基本3層應用程序的樣子。

  1. UI(您的形式和UI支持對象)
  2. BLL(GetAllUsers,SaveUser,DeleteUser等)
  3. 數據(ADO,EF等)

在您的特定情況下,你真的在尋找Master-detail概念。在那裏你顯示的用戶列表的主通常是一個

// Master 
var _userList = Service.GetAllUsers(); // List<UserModel> 
userGrid.Datasource = _userList; 

我不會在這裏討論,但你可以設置綁定等網格,點擊會導致被填充細節控制。或手動

// detail 
UserModel model = master._userList[currIndex]; 
txtFirstName.Text = model.FirstName; 
txtPhone.Text = model.Phone; 
// . . . . 

現在,當然,你要改變文本框,並保存用戶...

// detail 
UserModel model = master._userList[currIndex]; 
Service.SaveUser(model); 
Master.Reload(); 

這是一般的想法,如何做到這一點。如果你遵循,你有不同的層次。用戶界面調用服務,調用數據。例如,你有BLL

// Service 
private IUserDataProvider _provider; 

public List<UserModel> GetAllUsers() 
{ 
    var data = _provider.Get<User>(); 
    // massage your 'data' and return List<UserModel> 
    . . . . 
} 

你的供應商可能會返回一些不需要的數據,這樣你就可以使用BLL修剪它,只返回相應的數據。但是你不知道提供者在做什麼。可能是它在做Ado.net或Entity Framework。因此,層的真正分離。