0

UserPostなどの単純な例を使用して、エンティティフレームワークとリポジトリパターンで戦略パターンを公開しようとしています。純粋なPOCOエンティティフレームワークを使用したリポジトリパターンでの戦略例の取得

この回答hereから、私は、次のドメインを持っている:

public interface IUser { 
    public Guid UserId { get; set; } 
    public string UserName { get; set; } 
    public IEnumerable<Post> Posts { get; set; } 
} 

は、ユーザーが使用されますする役割をサポートするためのインターフェイスを追加します。 (私がこだわっている)

public interface IUserRepository { 
    User Get<TRole>(Guid userId) where TRole : IUser; 
} 

戦略

public interface IAddPostsToUser : IUser { 
    public void AddPost(Post post); 
} 

今私のリポジトリには、次のようになります。このコードはどうすればよいですか?これを実装する方法の例がありますか?これはどこに入れますか?

public interface IFetchingStrategy<TRole> { 
    TRole Fetch(Guid id, IRepository<TRole> role) 
} 

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

答えて

1

我々は戦略パターンについて話す場合、IFetchingStrategyがIUserRepositoryに渡さなければならないので、私はあなたが操作をゲット変更すべきだと思う:

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

これは戦略パターンと呼ばれていますか? –

+0

これは戦略パターンではありません。問題を解決したいのですかパターンを使用したいですか? :) –

+0

:)これは戦略パターンよりも理にかなっています。少なくとも、すべてのタイプのユーザーにクラスのクラスを書く必要はありません。ありがとう。 –

関連する問題