8

Ich versuche ein generisches Repository zu implementieren. Das ist, was ich so weit gekommen ...Wie implementiert man eine generische RepositoryFactory?

public interface IRepositoryFactory 
{ 
    IRepository<T> RepositoryOf<T>() where T : class; 
} 

public class EntityFrameworkRepositoryFactory : IRepositoryFactory 
{ 
    private readonly IWindsorContainer _container; 

    public EntityFrameworkRepositoryFactory(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IRepository<T> RepositoryOf<T>() where T : class 
    { 
     var repository = _container.Resolve<IRepository<T>>(); 
     return repository; 
    } 
} 

Die RepositoryFactory von meiner Arbeitseinheit Implementierung verwendet wird

public interface IUnitOfWork : IDisposable 
{ 
    IRepository<T> RepositoryOf<T>() where T : class; 
    void Commit(); 
} 

Wie dem auch sei, die Frage, die ich stellen möchte, ist, ob die RepositoryFactory Umsetzung mit abhängig von IWindsorContainer ist richtig?

brauchte ich einen Weg für eine IRepository jeglicher Art zu fragen, so dass mein Installateur Code tut dies ...

// Windsor Container 
container.Register(
    Component.For<IWindsorContainer>() 
     .Named("Container") 
     .Instance(container) 
    ); 

Welche scheint nur gegen das gesamte Konzept der IoC zu gehen, aber dann vielleicht die ganze Idee, nach einem Repository zu fragen, macht das trotzdem.

Edit (Als Antwort auf miensol ‚s Antwort)

ich bereits Windsor bin mit dem Endlager für mich mit dem folgenden Code in meinem Installateur erstellen ...

// Generic Repository 
container.Register(
    Component.For(typeof (IRepository<>)) 
     .ImplementedBy(typeof (EntityFrameworkRepository<>)) 
     .ServiceOverrides(
      ServiceOverride.ForKey("objectContext").Eq("ObjectContext")) 
    ); 

Ich habe benutze ServiceLocator in der Vergangenheit, um zu erreichen, was ich will, aber gelesen habe, dass es ein bisschen ein Anti-Muster ist. Also versuchte ich es zu vermeiden. Obwohl ich zugeben muss, dass ich mir nicht sicher bin, warum, scheint das, was ich getan habe, auch falsch zu sein, da ich Castle Windsor als mein IoC/DI-Framework verwenden muss. Service Locator soll rahmenunabhängig sein.

Also, ich bin ein bisschen verwirrt!

+1

hat dieses Bild eine Antwort, aber es ist eher ein Kommentar - diese tangential nützlich sein könnten (beantwortet eine ähnliche Frage bereits heute): [1]: http://stackoverflow.com/questions/3175/ Re pository-pattern-tutorial-in-c [2]: http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-mit-linq-to.htm –

+0

Ja, es gibt viele ähnliche Fragen. Ich denke, ich habe über 3 von ihnen beantwortet .. – RPM1984

+0

@Tim: Link # 2 ist kaputt. –

Antwort

5

Ich bin nicht ganz sicher, warum Sie IRepositoryFactory benötigen, wenn Sie ein IoC-Framework verwenden. Abhängigkeiten von bestimmten IoC-Container-Implementierungen, die über die Codebasis verstreut sind, sind jedoch im Allgemeinen keine gute Idee. Die meiste Zeit, wenn ich wirklich einen Weg nicht finden kann, um den Container Abhängigkeiten zu meinen Objekten injizieren Ich benutze Service Locator Pattern, here Sie können eine häufig verwendete Implementierung für .net finden. Dann ist Ihre Factory-Methode würde wie folgt aussehen:

public IRepository<T> RepositoryOf<T>() where T : class 
{ 
    return ServiceLocator.Current.GetInstance<IRepository<T>>(); 
} 

Dennoch scheint es, wie Sie könnten nur irgendwie für Sie die generische Repository machen Windsor erstellen:

container.Register(
    Component.For(typeof(IRepository<>)).ImplementedBy(typeof(GenericRepositoryImplementation<>)) 
); 

und wie so, um Ihre Objekte sie injiziert zu haben:

public class ClassThatRequiresSomeRepos 
{ 
    IRepository<OneEntity> repoOne; 
    IRepository<TwoEntity> repoTwo; 

    public ClassThatRequiresSomeRepos(IRepository<OneEntity> oneEntityRepository, IRepository<TwoEntity> twoEntityRepository) 
    { 
    _repoOne = oneEntityRepository; 
    _repoTwo = twoEntityRepository; 
    } 
} 
+0

Dies ist das erste, was mir in den Kopf sprang, wenn ich dies las, gute Antwort. – Burt

+0

Bitte beachten Sie die Bearbeitung meiner Frage. tbh, ich bin mir nicht sicher, ob ServiceLocator ein Anti-Pattern ist oder nicht. Es scheint mir gut zu sein, solange Sie die Anzahl der Orte begrenzen, an denen es heißt. –