0

Ich versuche, ein Strategie-Muster mit Entity-Framework und das Repository-Muster mit einem einfachen Beispiel wie User und Post, in denen ein Benutzer hat viele Beiträge.Abrufen Strategie Beispiel in Repository-Muster mit reinen POCO Entity Framework

Aus dieser Antwort here, ich habe die folgende Domain:

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

Schnittstellen Fügen Sie die Rollen, in denen unterstützen Sie den Benutzer verwenden.

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

Jetzt ist mein Repository sieht wie folgt aus:

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

Strategie (Wo ich bin stecken). Was mache ich mit diesem Code? Kann ich ein Beispiel dafür haben, wie ich das umsetzen kann?

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

Mein grundlegendes Problem war, was in this question gefragt wurde. Ich möchte in der Lage sein, Benutzer ohne Beiträge und Benutzer mit Beiträgen zu erhalten, die das Strategie-Muster verwenden.

Antwort

1

Wenn wir über Strategie Muster sprechen dann IFetchingStrategy muss IUserRepository übergeben werden, so denke ich, Sie Operation Get ändern sollte:

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

Aber ich bin nicht sicher, wie solche Schnittstellen mit EF zu implementieren.

Wenn wir auf Ihre erste Frage zurückkehren, kann es auch auf diese Weise erreicht werden:

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

werden Sie die Methode, um diese Art und Weise verwenden:

User userWithoutPosts = repository.Get(guid, null); 
User userWithPosts = repository.Get(guid, new List<Expression<Func<User,object>>> 
    { 
     u => u.Posts 
    }); 

Aber ich denke, dass diese Umsetzung funktioniert nur für die erste Ebene der Navigationseigenschaften.

+0

Also das nennen sie Strategie Muster? –

+0

Nein, das ist kein Strategie-Muster. Möchten Sie das Problem lösen oder das Muster verwenden? :) –

+0

:) Das macht mehr Sinn als Strategie-Muster, zumindest muss ich nicht für jede Art von Benutzer eine Reihe von Klassen schreiben. Vielen Dank. –

Verwandte Themen