पर निर्भरता इंजेक्शन कैसे लागू करूं। मैंने अभी मार्क सीमैन की पुस्तक .NET पर निर्भरता इंजेक्शन समाप्त कर दिया है और अब मैं कुछ विरासत कोड को दोबारा करने की कोशिश कर रहा हूं। (मैं इस चरण में, किसी भी विशेष डी कंटेनर पर भरोसा नहीं कर रहा हूं, बल्कि सभी निर्भरताओं को एक स्थान पर ले जाने की कोशिश कर रहा हूं)।मैं एक अमूर्त फैक्ट्री
मैं निम्नलिखित कारखाने वर्ग जो archiveReader.GetArchiveType()
साथ संग्रह के पहले कुछ बाइट्स पढ़कर ArchiveType
निर्धारित करता है पर देख रहा हूँ और फिर ArchiveType
enum के आधार पर एक ArchiveRestorer
का एक उदाहरण देता है।
public class ArchiveRestorerFactory : IArchiveRestorerFactory
{
public ArchiveRestorer Create(ArchiveReader archiveReader)
{
ArchiveType type = archiveReader.GetArchiveType();
switch (type)
{
case ArchiveType.CurrentData:
return new CurrentDataArchiveRestorer(archiveReader);
break;
case ArchiveType.HistoricalData:
return new HistoricalDataArchiveRestorer(archiveReader);
break;
case ArchiveType.AuditTrail:
return new AuditTrailArchiveRestorer(archiveReader);
break;
default:
throw new Exception("ArchiveRestorerFactory error: Unknown value for ArchiveType.");
}
}
}
मैं यह कैसे refactor है ताकि वर्ग ठोस प्रकार CurrentDataArchiveRestorer
, HistoricalDataArchiveRestorer
और AuditTrailArchiveRestorer
पर निर्भर नहीं करता?
क्या मुझे तीन ठोस पुनर्स्थापकों को कारखाने के निर्माता में स्थानांतरित करना चाहिए?
public ArchiveRestorer Create(ArchiveReader archiveReader,
ArchiveRestorer currentDataArchiveRestorer,
ArchiveRestorer historicalDataArchiveRestorer,
ArchiveRestorer auditTrailDataArchiveRestorer)
{
// guard clauses...
// assign to readonly fields
}
दृष्टिकोण प्रतीत हो रहा है कि सुझाव दिया here, लेकिन तब यह जब केवल एक की जरूरत है सभी तीन संरक्षणकर्ताओं का दृष्टांत होगा? क्या होगा यदि मेरे पास 20 अलग-अलग संभावित ठोस कार्यान्वयन हों?
मुझे लगता है कि मुझे प्रत्येक प्रकार के पुनर्स्थापक के लिए एक ठोस कारखाना लागू करना चाहिए और इसके बदले में लौटना चाहिए, लेकिन फिर मैं एक new
को दूसरे के साथ बदल दूंगा।
इस पर प्रतिक्रिया करने का सबसे अच्छा तरीका क्या है?
मुझे लगता है कि आपका परिदृश्य जिम्मेदारी पैटर्न की श्रृंखला के लिए बेहतर अनुकूल हो सकता है। एक विशिष्ट डी कंटेनर (एकता) के संयोजन के साथ पैटर्न के उपयोग के लिए [इस उदाहरण] (http://davidhayden.com/blog/dave/archive/2008/11/19/ChainResponsibilityDesignPatternUnityDependencyInjectionContainer.aspx) को देखें। –
मैं इस तरह श्रृंखला के पंजीकरण और असेंबली को लागू नहीं करता, लेकिन यह निश्चित रूप से एक वैध दृष्टिकोण है। –
'अनावश्यक') के अलावा 'enum'' के उपयोग के अलावा, विशेष रूप से आपके वर्तमान कार्यान्वयन के बारे में आपको क्या परेशानी होती है? –