使用纯POCO实体框架在存储库模式中获取策略示例

时间:2011-01-16 17:31:07

标签: entity-framework repository-pattern poco strategy-pattern

我正在尝试使用实例框架和存储库模式推出策略模式,使用一个简单的示例,例如UserPost,其中用户有很多帖子。

从这个答案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中提出的问题。我希望能够让没有帖子的用户和使用策略模式的帖子的用户。

2 个答案:

答案 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)