存储库模式中的共享存储库
存储库依赖? 假设我有一个类似于以下内容的域:
public class User { public int UserId { get; set; } public Lazy Posts { get; set; } } public class Post { public int PostId { get; set; } public User Poster { get; set; } }
有我post的用户。
如何设置我的存储库,以便为每个user
返回一个Post
列表,对于每个post
,我都会收到Poster
?
我有2个存储库:
public class UserRepository : IUserRepository { public IQueryable GetUsers(); } public class PostRepository : IPostRepository { public IQueryable GetPosts(); }
我尝试从一个存储库调用另一个存储库,但它最终导致崩溃,因为存在循环依赖关系。
我正在使用存储库模式的POCO方法和entity framework。
我有2个存储库:
public class UserRepository : IUserRepository { public IQueryable
GetUsers(); } public class PostRepository : IPostRepository { public IQueryable GetPosts(); }
这可能会成为问题。
您可能不想简单地使用GetUsers
。 如您所说,您希望子实体加载了聚合或顶级实体。
会发生什么情况取决于使用环境 – 您的直接目的是什么 – 您将需要该User
变体。 你最终可能会GetUsers
像GetUsers
, GetUsersWithPosts
, GetUsersForImportantReport
, GetUsersForAttendingAnIceCreamSocial
等等的方法,令人作呕。
缺少的是角色的概念。
您检索用户的角色是什么? 这里明确的模型。
从聚合的基本界面开始。 基本属性可以在这里
public interface IUser { public Guid UserId { get; set; } public string UserName { get; set; } public IEnumerable { get; set; } }
添加接口以支持您将使用该用户的角色。
public interface IAddPostsToUser : IUser { public void AddPost(Post post); }
您的存储库可以这样定义:
public interface IUserRepository { User Get(Guid userId) where TRole : IUser; }
现在,使用该角色来定义提取策略;
public interface IFetchingStrategy { TRole Fetch(Guid id, IRepository role) }
您的存储库将通过注入或服务位置和调用获取来获取提取策略。 您可以传递存储库以提供FetchingStrategy查询的机制,或让FetchingStrategy注入或查找需要查询的服务。
当然,您的查询方式取决于您的ORM。
但这种建模方式有助于避免在不同场景中加载实体图形时出现的许多问题。
恕我直言,这属于服务层,而不是存储库层。 存储库只包装数据库。
public IQueryable 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 } };
…根据需要添加安全问题,聚合等。