2015-05-27 21 views
2

我在我的「用戶」表中關係到部門,角色和團隊。如何以正確的方式檢索存儲庫模式中的關係數據?

建議是當我通過存儲庫查詢數據時,所以我更願意返回「用戶」模型,填寫部門,角色和團隊的完整對象和屬性。

我目前的解決方案是使用服務層從相關存儲庫(UserService.cs)設置用戶屬性。我的項目有服務層(Service),數據層(Repository)和域模型(Domain Model)。

請參閱下面的示例代碼:

型號/ User.cs

public class User{ 
    public string username { get; set; } 
    public string firstname { get; set; } 
    public string surname { get; set; } 
    public Int32 DepartmentId { get; set; } 
    public Department Department { get; set; } 
    public Int32 RoleId { get; set; } 
    public Role Role { get; set; } 
    public IList<Team> Teams { get; set; } 
} 

庫/ UserRepository.cs

public class UserRepository : IUserRepository{ 
    private sqlSelectStatement = String.Format(@"SELECT u.[Id] 
                 ,[UserName] 
                 ,[FirstName] 
                 ,[LastName] 
                 ,[Email] 
                 ,[Telephone] 
                 ,[DepartmentId] 
                 ,[TeamId] 
                 ,[RoleId] 
                 ,[Enabled] 
                 ,[Created] 
                 ,[Modified] 
                 ,[UpdatedBy] 
                 FROM {0}[User] ", SchemaOwner); 

     public IEnumerable<User> GetAll() 
     { 
      var dbcommand = this.SessionContext.GetSqlCommand(sqlSelectStatement); 
      return this.SessionContext.GetList<User>(dbcommand); 
     } 
} 

服務/ UserService.cs

public class UserService : IUserService 
{ 
    private IUserRepository userRepository; 
    private ITeamRepository teamRepository; 
    private IDepartmentRepository departmentRepository; 
    private IRoleRepository roleRepository; 


    public IEnumerable<User> GetAll() 
    { 
     var users = userRepository.GetAll(); 
     var departments = departmentRepository.GetAll(); 
     var teamMembers = teamMemberRepository.GetAll(); 
     var roles= roleRepository.GetAll(); 

     foreach (User user in users){ 
       user.Department = departments.Where(department=>department.Id== user.departmentId); 
       user.Role = roles.Where(role=>role.Id== user.roleId); 
       user.Teams = teams.where(team=>team.UserId == user.Id); 
     } 

    } 
} 

請注意,我沒有使用任何「ORM」的框架和我沒有任何計劃使用的「ORM」

+0

歡迎來到Stack Overflow!與論壇網站不同,我們不使用「謝謝」或「任何幫助表示讚賞」,或在[so]上簽名。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed - 從 - 個)。 –

回答

1

我認爲你可以很容易地識別出幾個問題,你目前的做法。加載所有用戶的複雜性非常可怕(SELECT N + 1,例如,爲每個用戶發出另一個O(n)查詢,給你O(n^2)性能) - 保存用戶對象時會發生什麼?保存更改部門等?

我會解決這個問題的方法是根據Aggregate Roots和Value Objects的概念爲域建模,這兩個概念都是域驅動設計的概念。你會發現很多資源,但是執行摘要是聚合根具有全局標識,並且在它的聚合邊界中「擁有」了所有瞬態值對象。每個聚合根應該有一個存儲庫。

嘗試 避免聚合根之間的顯式依賴關係(即,如果部門對您的應用程序有意義,請勿將Department屬性添加到您的User對象)。聚合應該是獨立的,並且依靠ID彼此依賴。修改單個聚合的操作應封裝在其中一個聚合對象上,而需要接觸多個聚合根的操作(例如,將用戶分配給新部門)應該放入一個服務中,該服務負責使用它們加載和修改兩個聚合庫。

相關問題