我正在尝试使用实例框架和存储库模式推出策略模式,使用一个简单的示例,例如User
和Post
,其中用户有很多帖子。
从这个答案here,我有以下域名:
public interface IUser {
public Guid UserId { get; set; }
public string UserName { get; set; }
public IEnumerable<Post> 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)
}
我的基本问题是this question中提出的问题。我希望能够让没有帖子的用户和使用策略模式的帖子的用户。
答案 0 :(得分:1)
如果我们谈论策略模式,那么必须将IFetchingStrategy传递给IUserRepository,所以我认为你应该修改Get操作:
public interface IUserRepository
{
User Get<TRole>(Guid userId, IFetchingStrategy<TRole> strategy) where TRole : IUser;
}
但我不确定如何使用EF实现这样的接口。
如果我们回到你以前的问题,它也可以通过这种方式完成:
public interface IUserRepository
{
User Get(Guid userId, IEnumerable<Expression<Func<User,object>>> eagerLoading);
}
public class UserRepository : IUserRepository
{
public User Get(Guid userId, IEnumerable<Expression<Func<User,object>>> eagerLoading)
{
ObjectQuery<User> query = GetBaseQuery(); // get query somehow, for example from ObjectSet<User>
if (eagerLoading != null)
{
foreach(var expression in eagerLoading)
{
// This is not supported out of the box. You need this:
// http://msmvps.com/blogs/matthieu/archive/2008/06/06/entity-framework-include-with-func-next.aspx
query = query.Include(expression);
}
}
return query.SingleOrDefault(u => u.Id == userId);
}
}
您将以这种方式使用该方法:
User userWithoutPosts = repository.Get(guid, null);
User userWithPosts = repository.Get(guid, new List<Expression<Func<User,object>>>
{
u => u.Posts
});
但我想这个实现仅适用于第一级导航属性。
答案 1 :(得分:0)