मैं बेहतर टेस्टेबिलिटी और लूसर युग्मन के लिए आईओसी, डीआई और ओओडी के साथ बेहतर होने की कोशिश कर रहा हूं।आईओसी कंटेनर का उपयोग करते हुए ओओडी - निर्भर वस्तुओं का निर्माण कैसे करें?
तो जब हम आईओसी और डि का भारी इस्तेमाल के साथ कक्षाएं डिजाइन हम उदाहरण
class Processor
{
private IService1 m_Service1;
private IService2 m_Service2;
private IService3 m_Service3;
//approach 1
public Processor(IService1 service1, IService2 service2, IService3 service3)
{
m_Service1 = service1;
m_Service2 = service2;
m_Service3 = service3;
}
//approach 2
public Processor(IContainer container)
{
m_Service1 = container.Resolve<IService1>();
m_Service2 = container.Resolve<IService2>();
m_Service3 = container.Resolve<IService3>();
}
//approach 3
public delegate Processor Factory();
}
इम सोच क्या सामान्य दृष्टिकोण यहाँ होना चाहिए के लिए कई निर्भरता के साथ वर्गों के साथ endup कर सकते हैं। हम 3 मानकों के साथ निर्माता छोड़ सकते हैं, लेकिन हम autofac का उपयोग करके एप्लिकेशन (उदाहरण के लिए) सबसे अधिक संभावना का निर्माण कर रहे है, तो यह शायद ही कभी की तरह
Processor proc = new Processor(
container.Resolve<IService1>(),
container.Resolve<IService2>(),
container.Resolve<IService3>());
कुछ कंटेनर उदाहरण से प्रकार के समाधान तो मैं शायद दृष्टिकोण सोच रहा हूँ के अलावा किसी और का उपयोग किया जाएगा 2 बेहतर है, जब हम कंटेनर से कई प्रकारों पर निर्भर करते हैं। वैसे भी हमें कहीं ऑटोफैक का संदर्भ जोड़ना होगा, इसलिए अब कोई कारण नहीं है?
Autofac भी प्रदान करता है प्रतिनिधि कारखाने विधि दृष्टिकोण
http://code.google.com/p/autofac/wiki/DelegateFactories
var processorFactory = container.Resolve<Processor.Factory>();
Processor processor = processorFactory.Invoke();
तो हम भी दृष्टिकोण है 3 - हम अपने वर्ग उदाहरण बना करने के लिए निर्माताओं का उपयोग नहीं होगा, बजाय हम कंटेनर से हल हो गई प्रतिनिधि कॉल करेंगे और यह हमारे लिए निर्भरताओं को हल करेगा।
चूंकि आईओसी के लिए काफी नया है, यह कहना मुश्किल है कि हमें 1,2,3 का उपयोग करना चाहिए। उनके पास फायदे और नुकसान हैं।
मुझे लगता है कि अगर कक्षा में 1 निर्भरता है तो हम शायद हमेशा दृष्टिकोण 1 का उपयोग कर सकते हैं .. इसके अलावा मुझे वास्तव में यकीन नहीं है कि क्या चुनना है और कब।
अद्यतन मैं सेवा लोकेटर विरोधी पैटर्न लेकिन Ive के बारे में पढ़ा है 4 (या सच 3 दृष्टिकोण)
छोड़करServiceLocator करने के लिए अपने पास के साथ आते हैं अपनी नहीं है, हम एक वस्तु है कि इस
तरह लग रहा है पारितpublic class ServiceLocatorObject
{
private IService1 m_Service1;
private IService2 m_Service2;
private IService3 m_Service3;
public IService1 Service1 {get {return m_Service1;}}
public IService2 Service2 {get {return m_Service2;}}
public IService3 Service3 {get {return m_Service3;}}
public ServiceLocatorObject(IService1 service1, IService2 service2, IService3 service3)
{
m_Service1 = service1;
m_Service2 = service2;
m_Service3 = service3;
}
}
और अब हम बनाने
//approach 4
public Processor(ServiceLocatorObject servicesToUse)
{
m_Services = servicesToUse;
}
अब हम सेवा कार्यान्वयन से हमारी कक्षा decoupled है एक डी यह स्पष्ट करता है कि वास्तविक निर्भरताओं की क्या ज़रूरत है (यदि हम मानते हैं कि पारित वस्तु पर उपलब्ध सभी सेवाओं की आवश्यकता है) क्योंकि हम एक कंटेनर नहीं पारित कर रहे हैं जिसमें 100 कार्यान्वयन हो सकते हैं। और उस ऑब्जेक्ट का पुन: उपयोग भी किया जा सकता है यदि हमारे आवेदन में किसी अन्य वर्ग में उस 3 सेवा संयोजन की आवश्यकता हो सकती है। तो हम कन्स्ट्रक्टर डी नहीं सेवा लोकेटर पैटर्न का उपयोग कर रहे हैं। इंटरफेस स्पष्ट है और निर्भरताओं के साथ अधिभारित नहीं है, नई कक्षा एक अच्छा पुन: उपयोग उम्मीदवार हो सकता है।
आप इस बारे में क्या कहेंगे?
लिंक अच्छा है, यह पुस्तक बिल्कुल वैसा ही दिखती है जो मुझे चाहिए। तीसरे दृष्टिकोण के बारे में आप क्या सोचते हैं? –
+1 और टिप्पणियों के लिए मेरा उत्तर देखें। –
मैं अपने कोड पर तीसरे दृष्टिकोण का उपयोग करता हूं ... जब मुझे समय के साथ एक प्रकार के कई उदाहरण बनाने के साधनों को इंजेक्ट करने की आवश्यकता होती है। मैं विंडसर का उपयोग करता हूं ... इसलिए मैं प्रतिनिधि कारखानों का बहुत उपयोग करता हूं, और Func इंजेक्ट करता हूं जब मुझे पता है कि मेरे प्रोसेसर को समय के साथ कई IService1s बनाने की आवश्यकता होगी ... –
Jeff