1

ユーザーが多くの投稿を持っている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)
}

私の基本的な問題は、この質問で尋ねられたことです。戦略パターンを使用して、投稿のないユーザーと投稿のあるユーザーを取得できるようにしたいと考えています。

4

2 に答える 2

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 
    });

しかし、この実装はナビゲーション プロパティの最初のレベルでのみ機能すると思います。

于 2011-01-17T11:48:50.453 に答える
0

次の投稿の回答では、戦略パターンを使用してクエリを操作しています。

https://codereview.stackexchange.com/questions/3560/is-there-a-better-way-to-do-dynamic-filtering-and-sorting-with-entity-framework

于 2012-04-06T14:43:41.763 に答える