[英]Shared repositories in repository pattern
存儲庫依賴? 假設我有一個如下所示的域名:
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方法和實體框架。
我有2個存儲庫:
public class UserRepository : IUserRepository { public IQueryable<User> GetUsers(); } public class PostRepository : IPostRepository { public IQueryable<Post> GetPosts(); }
這可能會成為問題。
您可能不想簡單地使用GetUsers
。 如您所說,您希望子實體加載了聚合或頂級實體。
會發生什么情況取決於使用環境 - 您的直接目的是什么 - 您將需要該User
變體。 你最終可能會GetUsers
像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。
但這種建模方式有助於避免在不同場景中加載實體圖形時出現的許多問題。
恕我直言,這屬於服務層,而不是存儲庫層。 存儲庫只包裝數據庫。
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
}
};
...根據需要添加安全問題,聚合等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.