C# 在哪里放置两个相关对象的业务逻辑?
假设我有两个实体:C# 在哪里放置两个相关对象的业务逻辑?,c#,architecture,business-logic,business-logic-layer,C#,Architecture,Business Logic,Business Logic Layer,假设我有两个实体:User和UserGroup 它们有一对多关系=>每个UserGroup实际上包含0到n个用户 如果我想为用户组检索用户,那么在我的业务层中,将该方法放在哪里会更好 在UserManager中,添加方法:GetAllUsersForUserGroup 在UserGroupManager中添加上述方法 我猜2号更好。但我不确定。 谢谢 更新 我想我不能完全解释我的意思。 是的,我们可以有用户,用户,组,组,等等 但我并不想找出可以应用哪些不同的模式等来实现业务。我的问题是:您是将
User
和UserGroup
它们有一对多关系=>每个
UserGroup
实际上包含0到n个用户
如果我想为用户组
检索用户,那么在我的业务层中,将该方法放在哪里会更好
UserManager
中,添加方法:GetAllUsersForUserGroup
UserGroupManager
中添加上述方法谢谢 更新
我想我不能完全解释我的意思。
是的,我们可以有
用户
,用户
,组
,组
,等等
但我并不想找出可以应用哪些不同的模式等来实现业务。我的问题是:您是将
GetAllUsersForUserGroup(int-UserGroupID)
放入UserManager
还是GroupManager
?你认为应该在管理用户的类中还是在管理用户组的类中定义GetAllUsersForUserGroup(int-UserGroupID)
?当然,如果不确切了解管理者和管理者的客户机是如何构造的,以及他们已经提供了哪些方法,就很难给出意见
假设管理器是简单的DAO,基本实体操作使用CRUD操作,我会考虑使用更高级别的UserRepository或UserService对象来提供更多类似“业务”的功能,例如
IList FindUserByGroup(用户组)代码>
总之,没有正确的答案,因为从逻辑上来说,你可能会争论任何一种方式-我的决定基于让经理尽可能简单,避免对象膨胀,密切关注应用程序在不久的将来如何发展,并在必要时进行重构。it可维护性成为一个问题。当然,如果不确切了解管理者和管理者客户的结构以及他们已经提供的方法,就很难给出意见
假设管理器是简单的DAO,基本实体操作使用CRUD操作,我会考虑使用更高级别的UserRepository或UserService对象来提供更多类似“业务”的功能,例如
IList FindUserByGroup(用户组)代码>
总之,没有正确的答案,因为从逻辑上来说,你可能会争论任何一种方式——我的决定是让管理者尽可能简单,避免对象膨胀,关注你如何看待应用程序在不久的将来的发展,如果有必要,重构它,可维护性成为一个问题。如果你得到一个用户列表,我会将该方法放在Users类中,因此它的内容自然,如:
Users.GetAllByUserGroup()
如果您得到一个用户列表,我会将该方法放在Users类中,因此它的内容很自然,比如:
Users.GetAllByUserGroup()
您也可以使用工厂模式
例如:
公共类用户工厂
{
公共静态列表GetUsers()
{
}
//从用户工厂获取组中用户的可选方法
公共静态列表GetUsersInGroup(int GroupID)
{
返回UserGroupFactory.GetUsersInGroup(int-GroupID)
}
}
公共类UserGroupFactory
{
公共静态列表GetUserGroups()
{
}
公共静态列表GetUsersInGroup(int GroupID)
{
}
}
如果用户组表中有用户和组ID,我将其放入UserGroup工厂。您也可以使用工厂模式
例如:
公共类用户工厂
{
公共静态列表GetUsers()
{
}
//从用户工厂获取组中用户的可选方法
公共静态列表GetUsersInGroup(int GroupID)
{
返回UserGroupFactory.GetUsersInGroup(int-GroupID)
}
}
公共类UserGroupFactory
{
公共静态列表GetUserGroups()
{
}
公共静态列表GetUsersInGroup(int GroupID)
{
}
}
如果用户组表中有用户,并且组ID是我放在UserGroup工厂中的。正如@Tom Carter所说的,很难准确地找出适合您的最佳答案,因为缺少很多细节。我认为大多数“管理器”类实际上可以使用良好的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> ();
}
}
公共类用户组
{
私有列表用户;
公共只读集合用户
{
获取{return _Users.AsReadOnly();}
}
public void AddUser(用户)
{
//在对象本身内部执行业务逻辑
_用户。添加(用户);
}
公共用户组()
:此(空)
{ }
公共用户组(列出用户)
{
_用户=用户??新列表();
}
}
这有助于构建一个丰富的对象,并将业务逻辑保留在对象中,使您不必求助于创建一堆“管理器”类。正如@Tom Carter所说,很难准确地找到适合您的最佳答案,因为缺少很多细节。我认为大多数“管理器”类实际上可以使用良好的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> ();
}
}
公共类用户组
{
私有列表用户;
公共只读集合用户
{
获取{return _Users.AsReadOnly();}
}
public void AddUser(用户)
{
//在对象本身内部执行业务逻辑
_用户。添加(用户);
}
公共用户组()
:此(空)
{ }
公共用户组(列出用户)
{
_用户=用户??新列表();
}
}
这有助于构建一个丰富的对象,并将业务逻辑保留在对象中,使您不必求助于创建一堆“管理器”类
您认为应该在管理用户的类或管理用户组的类中定义GetAllUsersForUserGroup(int UserGroupID)
这种方法是可行的
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