[英]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.