2011-06-08 86 views
1

假设我有两个实体:UserUserGroup
他们有一个一对多的关系=>每个UserGroup实际上包含0到n个用户。何处放置两个相关对象的业务逻辑?

如果我想检索UserGroup的用户,那么在我的业务层中放置该方法会更好?

  1. UserManager,添加方法:GetAllUsersForUserGroup
  2. UserGroupManager添加上述方法。

猜测2更好。但我不确定。
谢谢。

UPDATE
猜测我无法完全解释我的意思。
是的,我们可以有UserUsersGroupGroups

但我不是要找出什么不同的图案等可以应用到实现业务。我的问题是:你把GetAllUsersForUserGroup(int UserGroupID)UserManagerGroupManager?你认为GetAllUsersForUserGroup(int UserGroupID)应该在管理用户的班级还是在管理用户组的班级中定义?

回答

3

当然,如果不确切了解管理人员和管理人员的结构以及他们已经提供了哪些方法,很难给出意见。

假设管理者与CRUD操作简单的DAO,因为我会去想具有较高水平UserRepository或UserService对象提供更多的“生意”一样的功能,如

IList<User> FindUsersByGroup(UserGroup group);

基本实体操作总而言之,没有正确的答案,因为在逻辑上你可能会以任何方式争论 - 我会根据我的决定让管理者尽可能简单,避免对象膨胀,注意你在不久的将来会如何看待应用程序的发展,必要时重构它的可维护性成为一个问题。

+0

感谢。我了解你的建议,并且已经在我的图层中实现了它。我想知道的是:你会在哪里放置FindUsersByGroup方法?在'UserBLL'或'UserGroupBLL'中?你认为这个方法与哪个实体更相关? – Kamyar 2011-06-08 07:55:13

+0

@Kamyar - 不太清楚你的要求 - 如果UserBLL/UserGroupBLL是包含业务逻辑的域对象,那么两者都不 - 它们不应该对查找功能负责 - 将该任务委托给存储库对象。如果UserBLL和UserGroupBLL实际上只是DAO,那么就像我在答案中所说的那样,您可能会争论 - 我个人的选择是UserGroup,假设用户不知道UserGroups – 2011-06-08 08:10:56

+0

他们是DAO。我将在您确认的'UserGroupManager'中定义它。谢谢,抱歉,这个雄心勃勃的问题。 – Kamyar 2011-06-08 08:16:03

0

如果让用户的名单,我会放在用户类中的方法,所以它自然读取,如:

Users.GetAllByUserGroup() 
+0

谢谢。但我想我没有很好地解释我的问题。我试图更清楚我的问题。请参阅更新。 – Kamyar 2011-06-08 07:59:16

2

你也可以使用一个工厂模式。

如:

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我把把它的用户组工厂。

2

正如@Tom Carter所说的,很难找出你的最佳答案,因为缺少很多细节。我认为,大多数“经理”类实际上可以使用良好的OOP删除。

你的用户组类可以再这个样子:

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>(); 
    } 
} 

这有助于建立一个丰富的对象,并保持你的对象内的业务逻辑,并让您无需求助于创造了一堆“经理“班。

1

您认为GetAllUsersForUserGroup(int UserGroupID)应该在管理用户的类中还是在管理用户组的类中定义?

该方法应该在UserManager/UserRepository类中定义。

  1. Manager甲/ Repository类通常被设计成具有一组相似的方法用的具体类的对象的工作,例如User类。

  2. 这些方法包括通过某种规范创建/请求/从数据库/缓存/本地集合中获取类的一个或多个对象的方法。

  3. 方法GetUsers作者:UserGroup规范是其中的一种方法。

最简单的实现,如果所有用户都储存组内:

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