मैं एमवीसी 3, एंटिटी फ्रेमवर्क v4.3 कोड फर्स्ट, और सरल इंजेक्टर का उपयोग कर रहा हूं। मैं कई सरल वर्गों है कि इस तरह लग रहे है:नियंत्रक 0 इंजेक्शन निर्भरताओं की संख्या को कम करने के लिए कैसे करें
public class SomeThing
{
public int Id { get; set; }
public string Name { get; set; }
}
मैं किसी अन्य संस्था है कि इस तरह दिखता है:
public class MainClass
{
public int Id { get; set; }
public string Name { get; set; }
public virtual AThing AThingy { get; set; }
public virtual BThing BThingy { get; set; }
public virtual CThing CThingy { get; set; }
public virtual DThing DThingy { get; set; }
public virtual EThing EThingy { get; set; }
}
प्रत्येक thingy (वर्तमान में) तो तरह, अपने स्वयं के प्रबंधक वर्ग है:
public class SomeThingManager
{
private readonly IMyRepository<SomeThing> MyRepository;
public SomeThingManager(IMyRepository<SomeThing> myRepository)
{
MyRepository = myRepository;
}
}
मेरे MainController फलस्वरूप इस प्रकार है:
public class MainController
{
private readonly IMainManager MainManager;
private readonly IAThingManager AThingManager;
private readonly IBThingManager BThingManager;
private readonly ICThingManager CThingManager;
private readonly IDThingManager DThingManager;
private readonly IEThingManager EThingManager;
public MainController(IMainManager mainManager, IAThingManager aThingManager, IBThingManager bThingManager, ICThingManager cThingManager, IDThingManager dThingManager, IEThingManager eThingManager)
{
MainManager = mainManager;
AThingManager = aThingManager;
BThingManager = bThingManager;
CThingManager = cThingManager;
DThingManager = dThingManager;
EThingManager = eThingManager;
}
...various ActionMethods...
}
हकीकत में, इस नियंत्रक में कई बार इंजेक्शन निर्भरताएं हैं। इसमें गंध है। गंध खराब होती है जब आप यह भी जानते हैं कि सभी या अधिकांश निर्भरताओं के साथ एक अन्य नियंत्रक है। मैं इसे दोबारा बनाना चाहता हूं।
मुझे पहले से ही डीआई के बारे में पता है कि संपत्ति इंजेक्शन और सेवा लोकेटर अच्छे विचार नहीं हैं।
मैं अपने मेनकंट्रोलर को विभाजित नहीं कर सकता, क्योंकि यह एक एकल स्क्रीन है जिसके लिए इन सभी चीजों को एक ही सहेजें बटन के क्लिक के साथ प्रदर्शित और संपादन योग्य होना आवश्यक है। दूसरे शब्दों में, एक एकल पोस्ट एक्शन विधि सबकुछ बचाती है (हालांकि मैं इसे बदलने के लिए खुला हूं अगर यह समझ में आता है, जब तक कि यह अभी भी एक ही सहेजें बटन है)। यह स्क्रीन नॉकआउटज के साथ बनाई गई है और अगर यह एक फर्क पड़ता है तो अजाक्स पोस्ट के साथ बचाता है।
मैंने परिवेश संदर्भ का उपयोग हास्य किया, लेकिन मैं सकारात्मक नहीं हूं कि यह जाने का सही तरीका है। मैंने एक फेकाडे इंजेक्शन लगाने के उपयोग को भी हास्य किया। मैं यह भी सोच रहा हूं कि मुझे इस बिंदु पर कमांड आर्किटेक्चर लागू करना चाहिए या नहीं। (उपर्युक्त सभी को कहीं और गंध को स्थानांतरित नहीं करें?)
आखिरकार, और शायद ऊपर दिए गए तीनों दृष्टिकोणों से स्वतंत्र, क्या मुझे इसके बजाय एक ही कहना चाहिए, लुकअपमेनर को गेटैटिंग्स जैसे स्पष्ट तरीकों से() , GetAThing (आईडी), GetBThings(), GetBThing (आईडी), और इतने पर? (लेकिन तब लुकअपमेनर को इसमें कई इंजेक्शन, या एक नए प्रकार के भंडार की आवश्यकता होगी।)
मेरी संगीत एक तरफ है, मेरा सवाल दोहराया जाना है: पागल संख्या को कम करने के लिए इस कोड को दोबारा करने का एक अच्छा तरीका क्या है इंजेक्शन निर्भरता?
संभावित डुप्लिकेट [.NET में कन्स्ट्रक्टर ओवर-इंजेक्शन से कैसे निपटें] (http://stackoverflow.com/questions/4603555/how-to-deal-with-constructor-over-injection-in-net) – Steven