8

मैं एक जेनेरिक रिपोजिटरी को लागू करने की कोशिश कर रहा हूं। यह मैं अब तक क्या मिल गया है है ...एक सामान्य रिपोजिटरी फैक्ट्री को कैसे कार्यान्वित करें?

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, काम कार्यान्वयन की मेरी इकाई द्वारा प्रयोग किया जाता है

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

वैसे भी सवाल मैं पूछना चाहता हूँ है RepositoryFactory कार्यान्वयन होने कि क्या IWindsorContainer पर निर्भर सही है?

मैं, किसी भी प्रकार की एक IRepository के लिए पूछ का एक तरीका की जरूरत तो मेरे संस्थापक कोड इस ...

// Windsor Container 
container.Register(
    Component.For<IWindsorContainer>() 
     .Named("Container") 
     .Instance(container) 
    ); 
बस पूरे शायद आईओसी के पूरी अवधारणा के खिलाफ जाने के लिए लगता है, लेकिन फिर कौन सा

करता है एक भंडार मांगने का विचार वैसे भी करता है।

संपादित करें (miensol के जवाब देने के लिए उत्तर के रूप में)

मैं पहले ही अपनी संस्थापक में निम्न कोड के साथ मेरे लिए खजाने बनाने के लिए विंडसर उपयोग कर रहा हूँ ...

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

मेरे पास है अतीत में सर्विस लोकेटर का उपयोग जो मैं चाहता हूं उसे प्राप्त करने के लिए किया, लेकिन पढ़ा है कि यह एक विरोधी पैटर्न है। तो इसका इस्तेमाल करने से बचने की कोशिश कर रहा था। हालांकि मुझे यह मानना ​​है कि मुझे यकीन नहीं है कि, जैसा मैंने किया है, वह भी गलत लगता है क्योंकि मैं अपने आईओसी/डी ढांचे के रूप में कैसल विंडसर का उपयोग करने के लिए बाध्य हूं। सेवा लोकेटर फ्रेमवर्क अज्ञेयवादी होने के लिए है।

तो, मैं थोड़ा उलझन में हूँ!

+1

जोड़ा गया यह एक उत्तर है, लेकिन यह एक टिप्पणी की और भी है - इन स्पर्शरेखीय उपयोगी हो सकता है (आज पहले एक ऐसी ही सवाल का जवाब दे): [1]: http://stackoverflow.com/questions/3175/ फिर से पॉजिटरी-पैटर्न-ट्यूटोरियल-इन-सी [2]: http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.htm –

+0

हां बहुत सारे प्रश्न हैं। मुझे लगता है कि मैंने उनमें से 3 का जवाब दिया है .. – RPM1984

+0

@Tim: लिंक # 2 टूटा हुआ है। –

उत्तर

5

मुझे पूरी तरह से यकीन नहीं है कि जब आप आईओसी फ्रेमवर्क का उपयोग कर रहे हैं तो आपको IRepositoryFactory क्यों चाहिए। हालांकि विशिष्ट आईओसी कंटेनर कार्यान्वयन के लिए निर्भरताएं बिखरी हुई हैं हालांकि कोड आधार आम तौर पर एक अच्छा विचार नहीं है। अधिकांश समय जब मैं वास्तव में कंटेनर को मेरी ऑब्जेक्ट्स पर निर्भरता इंजेक्ट करने के लिए नहीं ढूंढ सकता, तो मैं सेवा लोकेटर पैटर्न, here का उपयोग करता हूं, आप .NET के लिए आमतौर पर उपयोग किए जाने वाले कार्यान्वयन को पा सकते हैं। फिर अपने कारखाने विधि इस प्रकार दिखाई देगा:

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

फिर भी ऐसा लगता है कि तुम सिर्फ विंडसर वैसे भी आप के लिए सामान्य भंडार बनाने के कर सकता है लगता है:

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

और होने उन्हें इतनी तरह अपने वस्तुओं के लिए इंजेक्शन:

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

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

यह पहली चीज है जो मेरे सिर में कूद गई जब मैंने इसे पढ़ा, अच्छा जवाब। – Burt

+0

कृपया मेरे प्रश्न के संपादन को देखें। टीबीएच, मुझे यकीन नहीं है कि सेवा लोकेटर एक विरोधी पैटर्न है या नहीं। यह तब तक ठीक लगता है जब तक आप इसे कहने वाले स्थानों की संख्या सीमित करते हैं। –

संबंधित मुद्दे