在哪里为两个相关对象放置业务逻辑?

时间:2011-06-08 07:34:48

标签: c# architecture business-logic business-logic-layer

假设我有两个实体:UserUserGroup 他们有一对多的关系=>每个UserGroup实际上包含0到n个用户。

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

  1. UserManager中,添加方法:GetAllUsersForUserGroup
  2. UserGroupManager中添加上述方法。
  3. 猜猜2更好。但我不确定 感谢。

    更新
    猜猜我无法完全解释我的意思 是的,我们可以UserUsersGroupGroups等。

    但我并不想知道可以应用哪些不同的模式等来实现业务。我的问题是:您是否将GetAllUsersForUserGroup(int UserGroupID)放入UserManagerGroupManager?您认为应该在管理用户的类中或在管理用户组的类中定义GetAllUsersForUserGroup(int UserGroupID)吗?

5 个答案:

答案 0 :(得分:3)

当然,如果不确切了解经理的管理者和客户是如何构建的,以及他们已经提供了哪些方法,那么很难发表意见。

假设管理器是基本实体操作的CRUD操作的简单DAO,我会考虑让更高级别的UserRepository或UserService对象提供更多“业务”功能,例如

IList<User> FindUsersByGroup( UserGroup group );

总而言之,没有正确答案,因为逻辑上你可以争论任何一种方式 - 我的决定是让管理者尽可能简单,避免对象膨胀,留意你如何看待应用程序在不久的将来,重构如果有必要,它的可维护性就成了一个问题。

答案 1 :(得分: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放在UserGroup工厂中。

答案 2 :(得分:2)

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

这有助于构建一个丰富的对象,并将业务逻辑保留在对象中,使您不必诉诸于创建一堆“Manager”类。

答案 3 :(得分:1)

  

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

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

  1. Manager / Repository类通常设计为具有一组类似的方法来处理具体类的对象,例如User类。

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

  3. Get规范Users UserGroup的方法是其中一种方法。

  4. 如果所有用户都存储在组中,则最简单的实现:

    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
    

答案 4 :(得分:0)

如果您获取用户列表,我会将该方法放在Users类中,因此它会自然地读取,如:

Users.GetAllByUserGroup()