放置两个相关对象的业务逻辑的位置
本文关键字:对象 业务 位置 两个 | 更新日期: 2023-09-27 17:58:33
假设我有两个实体:User
和 UserGroup
。
它们具有一对多关系 =>每个UserGroup
实际上包含 0 到 n 个用户数。
如果我想检索UserGroup
的用户,在我的业务层中放置该方法会是一个更好的类?
- 在
UserManager
中,添加方法:GetAllUsersForUserGroup
- 在
UserGroupManager
添加上述方法。
猜测 2 更好。但我不确定。
谢谢。
更新
猜猜我无法完全解释我的意思。
是的,我们可以有User
、Users
、Group
、Groups
等。
但我并不是想找出可以应用哪些不同的模式等来实现业务。 我的问题是:你把GetAllUsersForUserGroup(int UserGroupID)
放在UserManager
还是GroupManager
?您认为应该在管理用户的类中还是在管理用户组的类中定义GetAllUsersForUserGroup(int UserGroupID)
?
如果不确切知道经理和经理的客户是如何结构的以及他们已经提供的方法,就很难给出意见。
假设管理器是简单的DAO,具有用于基本实体操作的CRUD操作,我会考虑使用更高级别的UserRepository或UserService对象,提供更多类似于"业务"的功能,例如
IList<User> FindUsersByGroup( UserGroup group );
总而言之,没有正确的答案,因为从逻辑上讲,你可以以任何一种方式争论 - 我的决定是基于保持经理尽可能简单,避免对象膨胀,密切关注你如何看待应用程序在不久的将来的发展,并在必要时重构它的可维护性成为一个问题。
您也可以使用工厂模式。
例如:
public class UserFactory
{
public static List<User> GetUsers()
{
}
//Optional method to get users in group from user factory
public static List<User> GetUsersInGroup(int GroupID)
{
return UserGroupFactory.GetUsersInGroup(int GroupID)
}
}
public class UserGroupFactory
{
public static List<UserGroup> GetUserGroups()
{
}
public static List<User> GetUsersInGroup(int GroupID)
{
}
}
如果用户组表有用户,并且组 ID 我把它放在用户组工厂中。
正如@Tom卡特所说,很难为你找出最好的答案,因为缺少很多细节。 我认为大多数"管理器"类实际上都可以使用良好的 OOP 删除。
然后,您的 UserGroup 类可能如下所示:
public class UserGroup
{
private List<User> _Users;
public ReadOnlyCollection Users
{
get { return _Users.AsReadOnly (); }
}
public void AddUser (User User)
{
// Perform your business logic here inside the object itself
_Users.Add (User);
}
public UserGroup ()
: this (null)
{ }
public UserGroup (List<User> Users)
{
_Users = Users ?? new List<Users> ();
}
}
这有助于构建一个丰富的对象,并将业务逻辑保留在对象内部,并使您不必求助于创建一堆"管理器"类。
您认为应该在管理用户的类中还是在管理用户组的类中定义
GetAllUsersForUserGroup(int UserGroupID)
?
此方法应在UserManager
/UserRepository
类中定义。
-
Manager
/Repository
类通常设计为具有一组类似的方法来处理具体类的对象,例如User
类。 -
这些方法包括通过某些规范创建/请求/从数据库/缓存/本地收集类的一个或多个对象的方法。
-
按
UserGroup
规范Get
Users
方法是其中一种方法。
如果所有用户都存储在组中,则最简单的实现:
class UserRepository
function GetUsers(Group as UserGroup) as IEnumerable(of User)
return Group.Users
end function
end class
或者,如果所有用户都存储在一个集合中:
class UserRepository
private readonly UserCollection as ICollection(of User)
public function GetUsers(Group as UserGroup) as IEnumerable(of User)
return UserCollection.Where(function(U) U.Group.ID = Group.ID)
end function
end class
如果你得到一个用户列表,我会把这个方法放在 Users 类中,所以它读起来很自然,就像:
Users.GetAllByUserGroup()