2011-01-07 163 views
3

存儲庫依賴關係?可以說我有一個域如下所示:存儲庫模式中的共享存儲庫

public class User 
{ 
    public int UserId { get; set; } 
    public Lazy<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public User Poster { get; set; } 
} 

一位用戶與我的帖子。

如何設置我的存儲庫,以便爲每個user,它返回的Post併爲每post名單,我得到的Poster

我有2個倉庫:

public class UserRepository : IUserRepository 
{ 
    public IQueryable<User> GetUsers(); 
} 

public class PostRepository : IPostRepository 
{ 
    public IQueryable<Post> GetPosts(); 
} 

我打過電話從1個庫給對方,但在發生碰撞,因爲有一個循環依賴結束。

我正在使用存儲庫模式的POCO方法與實體框架。

+0

你在爲ORM使用什麼? NHibernate的,實體框架或其他。這將幫助我們給你更好的答案。 – ilivewithian 2011-01-07 17:09:26

+0

@ilivewithian EF4。 – 2011-01-07 17:13:03

回答

1

我有2個倉庫:

public class UserRepository : IUserRepository 
{ 
    public IQueryable<User> GetUsers(); 
} 

public class PostRepository : IPostRepository 
{ 
    public IQueryable<Post> GetPosts(); 
} 

這可能成爲問題。

您可能不想簡單地GetUsers。正如你所說,你希望子實體加載聚合或頂級實體。

會發生什麼情況是根據使用環境 - 您的直接目的是什麼 - 您需要在該User上的變體。你可能會最終得到像GetUsers,'GetUsersWithPosts,GetUsersForImportantReport,GetUsersForAttendingAnIceCreamSocial等等的方法,令人難以置信。

缺少的是角色的概念。

你爲用戶檢索什麼角色?這裏明確的模型。

從您的聚合的基礎接口開始。基本屬性可以在這裏

public interface IUser { 
    public Guid UserId { get; set; } 
    public string UserName { get; set; } 
    public IEnumerable<Posts> { get; set; } 
} 

添加接口以支持您將使用該用戶的角色。

public interface IAddPostsToUser : IUser { 
    public void AddPost(Post post); 
} 

而且你的資料庫可以被定義爲這樣的:

public interface IUserRepository { 
    User Get<TRole>(Guid userId) where TRole : IUser; 
} 

現在,使用該角色定義抓取策略;

public interface IFetchingStrategy<TRole> { 
    TRole Fetch(Guid id, IRepository<TRole> role) 
} 

您的存儲庫將通過注入或服務位置和調用獲取來獲取獲取策略。您可以通過存儲庫來爲FetchingStrategy提供查詢機制,或讓FetchingStrategy注入或查找需要查詢的服務。

當然,你究竟如何查詢將取決於你的ORM。

但是這種建模方式將有助於避免在不同情況下加載實體圖形時出現的許多問題。

-1

恕我直言,這屬於服務層,而不是儲存庫層。存儲庫只是包裝數據庫。

public IQueryable<UserData> GetUsersWithPosts() 
{ 
    return from u in UserRepository.GetUsers() 
      select new UserData 
      { 
       Id = u.Id, 
       Name = u.Name 
       Posts = from p in u.Posts 
         select new PostData 
         { 
          Id = u.Id, 
          Title = p.Title 
         } 
      }; 

...根據需要添加安全問題,聚合等。

+0

這意味着每次我得到一篇文章時,我都必須重寫由於POCO而從ORMDomain到我的域的轉換。 – 2011-01-07 17:17:28