我正试图在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类)。 非常感谢你的宝贵帮助
答案 0 :(得分:0)
将所有方法用于用户类中的用户数据。问自己一个问题,用户可以做什么?将控制用户的所有逻辑放在UserService中,如GetUserById,GetAllUsers,CreateUser等等。 将用户可以执行的所有方法放在User类中。 或者最近我构建了这样的东西,我将User和UserServices合并为一个,并使UserServices类方法保持静态,这样我就可以在不需要用户的情况下访问它们。
希望得到这个帮助。
答案 1 :(得分:0)
这是您的基本3层应用程序的样子。
在您的特定情况下,您真的在寻找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。因此,真正的层分离。