存储库模式中的共享存储库
存储库依赖关系?可以说我有一个域如下所示:存储库模式中的共享存储库
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
,'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
}
};
...根据需要添加安全问题,聚合等。
这意味着每次我得到一篇文章时,我都必须重写由于POCO而从ORMDomain到我的域的转换。 – 2011-01-07 17:17:28
你在为ORM使用什么? NHibernate的,实体框架或其他。这将帮助我们给你更好的答案。 – ilivewithian 2011-01-07 17:09:26
@ilivewithian EF4。 – 2011-01-07 17:13:03