8

Estoy tratando de implementar un Repositorio genérico. Esto es lo que tengo hasta ahora ...¿Cómo implementar un RepositoryFactory genérico?

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

El RepositoryFactory es utilizado por mi unidad de ejecución de los trabajos

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

De todos modos, la cuestión que quiero preguntarle es si tiene la aplicación RepositoryFactory Depende de IWindsorContainer es correcto?

necesitaba una manera de pedir un IRepository de cualquier tipo, por lo que mi código de instalador hace esto ...

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

Lo cual parece ir en contra de todo el concepto de la COI, pero entonces tal vez el conjunto la idea de pedir un repositorio lo hace de todos modos.

Editar (Como respuesta a miensol 's respuesta)

ya estoy usando Windsor para crear los repositorios para mí con el código siguiente en mi instalador ...

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

tengo Usé ServiceLocator en el pasado para lograr lo que quería, pero he leído que es un poco antipatrón. Entonces estaba tratando de evitar usarlo. Aunque tengo que admitir que no estoy seguro de por qué, ya que lo que hice también parece incorrecto, ya que estoy obligado a usar Castle Windsor como mi framework de IoC/DI. Service Locator está destinado a ser agnóstico de framework.

lo tanto, estoy un poco confundido!

+1

añadió esta es una respuesta, pero es más bien un comentario - tangencialmente estos podrían ser útiles (respondido a una pregunta similar el día de hoy): [1]: http://stackoverflow.com/questions/3175/ re pository-patrón-tutorial-en-c [2]: http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.htm –

+0

Sí hay un montón de preguntas similares. Creo que he respondido sobre 3 de ellos .. – RPM1984

+0

@Tim: El enlace # 2 está roto. –

Respuesta

5

no estoy del todo seguro de por qué se necesita IRepositoryFactory cuando se utiliza un marco COI. Sin embargo, tener dependencias con implementaciones de contenedor de IoC específicas dispersas a través de la base de código generalmente no es una buena idea. La mayor parte del tiempo en el que realmente no puedo encontrar una manera de hacer el contenedor inyectar dependencias a mis objetos que utilizo patrón Service Locator, here se puede encontrar una aplicación de uso común para .NET. Luego, su método de fábrica se vería así:

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

Sin embargo, parece como si sólo podría hacer Windsor crear el repositorio genérico para que de todos modos:

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

y haberlos inyectado a los objetos de esta manera:

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

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

Esto es lo primero que saltó en mi cabeza cuando leí esto, buena respuesta. – Burt

+0

por favor vea la edición de mi pregunta. tbh, no estoy seguro si ServiceLocator es un antipatrón o no. Me parece bien siempre que limites el número de lugares a los que se llama. –

Cuestiones relacionadas