2012-03-12 12 views
5

साथ सामान्य प्रकार के एक कारखाने सुई मैं भंडार कारखाने NhRepositoryFactoryकैसे Autofac

public interface IRepositoryFactory 
{ 
    IRepository<T> Create<T>() where T: Entity; 
} 

public class NhRepositoryFactory: IRepositoryFactory 
{ 
    public IRepository<T> Create<T>() where T : Entity 
    { 
    return new NhRepository<T>(); 
    } 
} 

है ताकि कुछ खजाने निर्भरता मैं उन्हें Autofac कंटेनर से प्राप्त करना चाहते हैं को हल करने में। तो मुझे किसी भी तरह से मेरी कक्षा में Func<IRepository<T>> फैक्ट्री इंजेक्ट करना चाहिए। मैं यह कैसे हासिल कर सकता हूं?
अग्रिम धन्यवाद।

+0

आप ऑटोफैक कंटेनर को 'NhRepositoryFactory' के अंदर क्यों नहीं स्टोर करेंगे? – Steven

+2

मैं चाहता हूं कि मेरा कारखाना ऑटोफैक-अज्ञेयवादी हो। –

+0

इसमें कोड की केवल एक पंक्ति शामिल है। आप इसे अपनी रचना रूट के अंदर रख सकते हैं। यह कंटेनर-अज्ञेयवादी नहीं होना चाहिए। – Steven

उत्तर

5

NhRepositoryFactory में कोई व्यावसायिक तर्क नहीं है और यह आपकी संरचना रूट का हिस्सा हो सकता है। यह आपको कंटेनर का संदर्भ देने देता है। This is just mechanics और इसे सर्विस लोकेटर एंटी-पैटर्न नहीं माना जाता है। NhRepositoryFactory इस तरह दिखेगा:

// This class is part of your composition root 
public class NhRepositoryFactory : IRepositoryFactory 
{ 
    private readonly Container container; 

    public NhRepositoryFactory(Container container) 
    { 
     this.container = container; 
    } 

    public IRepository<T> Create<T>() where T : Entity 
    { 
     return this.container.Resolve<NhRepository<T>>(); 
    } 
} 

और आप इसे इस तरह से रजिस्टर कर सकते हैं:

+0

मैं मानता हूं कि यह ऑटोफैक के साथ एक या दूसरे के साथ जोड़े के लिए अनिवार्य लगता है। मैंने इसे आपके द्वारा सुझाए गए तरीके से किया है। अंतर यह है कि मैंने 'कंटेनर' के बजाय 'ILIFetimeScope 'पारित किया। –

+0

मैंने कार्यान्वयन बदल दिया है। मैंने 'IObjectFactory' इंटरफेस बनाया है 'टी()' विधि 'जो ऑब्जेक्ट बनाने के लिए' ILIFetimeScope' का उपयोग करता है 'के साथ बनाया गया है। इसे 'ऑटोफैक ऑब्जेक्ट फैक्ट्री' वर्ग द्वारा कार्यान्वित किया जाता है जिसे 'एनएच रिपोजिटरी फैक्ट्री' में इंजेक्शन दिया जाता है। तो अब कोई ऑटोफैक-युग्मन नहीं है। –

+0

रिफैक्टरिंग 'आईरिपोजिटरी फैक्ट्री' को समाप्त करने के बाद समाप्त कर दिया गया है। इसकी जगह 'IObjectFactory' ले लिया है। –

4

Autofac भी कारखाने के बिना मूल रूप से सामान्य निर्माण संभाल करने में सक्षम है।

builder.RegisterGeneric(typeof(NhRepository<>)) 
    .As(typeof(IRepository<>)) 
    .InstancePerLifetimeScope(); 

इस पद्धति का उपयोग करते हुए आप बस IRepository पर निर्भरता ले जा सकते हैं और autofac निर्भरता को भरने जाएगा।

+1

मैंने इसे इस तरह से आजमाया है। लेकिन जब किसी वर्ग को कई रिपॉजिटरीज़ की आवश्यकता होती थी तो मुझे उन्हें कन्स्ट्रक्टर पैरामीटर के रूप में जोड़ना पड़ा। उनमें से प्रत्येक के लिए एक क्षेत्र भी बनाया जाना था। यह बेकार लग रहा था इसलिए मैंने एक कारखाना बनाया। –

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