8

Bir Genel Depo uygulamaya çalışıyorum. BuGenel bir RepositoryFactory nasıl uygulanır?

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

RepositoryFactory Sormak istediğim soru ise,

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

Neyse iş uygulamasının benim birimi tarafından kullanılmaktadır ... Ben şimdiye kadar var ne RepositoryFactory uygulanmasını sahip olmadığını IWindsorContainer bağlıdır doğru mu?

Ben, herhangi türde bir IRepository soran bir yola ihtiyacımız benim yükleyici kod sadece belki o zaman bütün IoC tüm konseptine karşı gelmek gibi görünüyor, ama bu ...

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

yapar böylece Bir depo sorma fikri bunu zaten yapar.

Düzenleme Ben

Zaten benim yükleyici aşağıdaki kodla benim için depolar oluşturmayı Windsor kullanıyorum

...

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

(miensol 'ın cevabı cevap olarak) İstediğim şeyi elde etmek için geçmişte ServiceLocator kullandı, ancak bunun bir anti-desen olduğunu biraz okudum. Bunu kullanmaktan kaçınmaya çalışıyordu. Her ne kadar emin değilim ki itiraf etmeliyim ki, yaptığım gibi ben de Castle Windsor'u IoC/DI framework'üm olarak kullanmak zorunda olduğum için yanlış görünüyor. Servis Belirleyici, çerçeve agnostiktir.

Biraz kafam karıştı!

+1

Eklendi bu bir cevap, ama daha fazla bir yorum var - bunlar teğet yararlı olabilir (bugün erken saatlerde benzer bir soru cevap): [1]: http://stackoverflow.com/questions/3175/ yeniden pository-pattern-tutorial-in-c [2]: http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.htm –

+0

Evet, birçok benzer soru var. Bence yaklaşık 3 tane cevap verdim .. – RPM1984

+0

@Tim: Link # 2 bozuk. –

cevap

5

IoC çerçevesini kullanırken neden neden IRepositoryFactory'a gereksiniminiz olduğundan emin değilim. Bununla birlikte, kod tabanı genel olarak iyi bir fikir olmamasına rağmen, belirli IoC konteyner uygulamalarına bağımlılıkların olması. Çoğu zaman yolunu kapsayıcıları nesnelerime enjekte etmek için bir yol bulamadığım için Hizmet Bulucu Kalıbı'nı kullanıyorum, here .net için yaygın olarak kullanılan bir uygulama bulabilirsiniz. Sonra fabrika yöntemi şu şekilde görünecektir:

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

Yine o sadece Windsor neyse sizin için jenerik depo oluşturmak yapabilir gibi görünüyor:

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

ve onları çok sevdiği nesnelere enjekte ettikten:

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

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

Bunu okuduğumda başıma sıçrayan ilk şey bu, iyi cevap. – Burt

+0

lütfen soruyu düzenle seçeneğine bakın. tbh, ServiceLocator'ın bir anti-pattern olup olmadığından emin değilim. Aradığı yer sayısını sınırlandırdığınız sürece bana iyi geliyor. –