Winform应用程序中的3层体系结构

时间:2017-10-13 06:29:53

标签: c# design-patterns architecture

我正试图在Winform中首次实现这种架构。所以我有一个简单但非常重要的问题。 举一个简单的例子。我希望表单检索用户列表并允许修改电话号码。 我有这个第一步(简化,我通常使用接口)

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数据库。 但是,在哪里放置它?用户或UserService(我不谈论SQL查询,只是逻辑) 之后,如何访问(此处或应用程序中的其他位置)此用户属性以在表单中显示它?直接使用_user.Id(用户必须在表单中实例化)或实现_userService。检索User.ID的id(在本例中,Form只知道UserService类)。 非常感谢你的宝贵帮助

2 个答案:

答案 0 :(得分:0)

将所有方法用于用户类中的用户数据。问自己一个问题,用户可以做什么?将控制用户的所有逻辑放在UserService中,如GetUserById,GetAllUsers,CreateUser等等。 将用户可以执行的所有方法放在User类中。 或者最近我构建了这样的东西,我将User和UserServices合并为一个,并使UserServices类方法保持静态,这样我就可以在不需要用户的情况下访问它们。

希望得到这个帮助。

答案 1 :(得分:0)

这是您的基本3层应用程序的样子。

  1. UI(您的表单和ui支持对象)
  2. BLL(GetAllUsers,SaveUser,DeleteUser等)
  3. 数据(ADO,EF等)
  4. 在您的特定情况下,您真的在寻找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();
    

    这是一般性的想法,如何做到这一点。如果你遵循,你有不同的层。 UI调用Service,它调用Data。例如,你有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。因此,真正的层分离。