2011-06-08 82 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