मैं एक परियोजना पर काम कर रहा हूं जो निनजेक्ट के माध्यम से निर्भरता इंजेक्शन का उपयोग करता है। अब तक, यह बहुत अच्छी तरह से काम कर रहा है, और मुझे डीआई बहुत पसंद है, लेकिन अब मैंने फैसला किया है कि मुझे कुछ ऑब्जेक्ट्स को क्रमबद्ध करने की आवश्यकता है, और मुझे DI पैटर्न के बाद ऐसा करना मुश्किल लगता है।कारखानों द्वारा बनाई गई वस्तुओं को क्रमबद्ध करने के लिए कैसे करें
public class Foo
{
private List<Bar> _bars;
private BarFactory _barFactory;
...
public void MakeBar()
{
_bars.Add(_barFactory.MakeBar());
}
}
यहाँ बार, जो जब _barFactory.MakeBar()
कहा जाता हो जाता है बना दिया जाता है:
मैं एक वर्ग फू कहा जाता है, जो बार्स की एक सूची है, और एक कारखाने के माध्यम से उन्हें बनाता है, इस तरह की है कहो। मैं बार serializable होना चाहते हैं:
public class Bar : ISerializable
{
private List<IPickle> _pickles;
private PickleFactory _pickleFactory;
public Bar(PickleFactory factory)
{
_pickleFactory = factory;
}
public void MakePickle(int x)
{
_pickles.Add(_pickleFactory.MakePickle(x));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
//serialize member variables here
}
//Constructor called during deserialization
private Bar(SerializationInfo info, StreamingContext context)
{
//fill in member variables with data from SerializationInfo
}
}
सूचना है कि बार अपनी ही कारखाने और अचार का एक संग्रह है। यहां समस्या है: जब बार के deserialization कन्स्ट्रक्टर बुलाया जाता है, तो मेरे पास इसे एक और PickleFactory पाने का कोई तरीका नहीं है। मूल PickleFactory BarFactory द्वारा बार को दिया गया था, लेकिन deserialization कन्स्ट्रक्टर BarFactory द्वारा नहीं कहा गया था।
इस समस्या को हल करने की मेरी वर्तमान योजना बार के सभी धारावाहिक सदस्यों को बारडाटा ऑब्जेक्ट नामक अपनी कक्षा में निकालना होगा। तब मैं BarDataObject serializable बनाऊंगा, लेकिन बार खुद नहीं। मैं BarFactory में एक फ़ंक्शन जोड़ूंगा जो पैराडाटा ऑब्जेक्ट को पैरामीटर के रूप में स्वीकार करता है और बारडाटा ऑब्जेक्ट से सभी जानकारी के साथ भरने के लिए एक बार बनाता है।
हालांकि, लगता है कि पिक भी में सेवा वर्ग हैं जो इसे फैक्ट्री से प्राप्त करते हैं, जिसे या तो क्रमबद्ध नहीं किया जा सकता है। तो मुझे पिकल से डेटाऑब्जेक्ट भी निकालना होगा, और मेरे बारडाटा ऑब्जेक्ट को एक PickleDataObject पर पकड़ना होगा। और मान लीजिए कि पिकले के पास डेटा और सेवाओं के मिश्रण के साथ सदस्य चर भी था? मुझे इसके लिए डेटाऑब्जेक्ट बनाना और बनाए रखना होगा। यह एक वास्तविक बमर की तरह लगता है, विशेष रूप से मेरे प्रोजेक्ट पर विचार करने के लिए कई अन्य चीजें हैं जिन्हें मुझे क्रमबद्ध करने की आवश्यकता है, और वे शायद एक ही समस्या का सामना करेंगे।
तो क्या कोई बेहतर समाधान है? क्या मैं कुछ गलत कर रहा हूं, बुद्धिमान? मैंने अभी डीआई और निनजेक्ट के साथ काम करना शुरू कर दिया है, लेकिन मुझे ऐसे किसी भी व्यक्ति को नहीं मिल रहा है जो सेवा वर्गों से इंजेक्शन वाली वस्तुओं को क्रमबद्ध करने के लिए एक अच्छा तरीका है।
क्या आप अपनी 'बारफैक्टरी' कक्षा में एक कन्स्ट्रक्टर जोड़ सकते हैं जो क्रमबद्धता जानकारी स्वीकार करता है? – Matthew
फू का किस प्रकार का ऑब्जेक्ट है? क्या यह एक 'नया' या 'इंजेक्शन योग्य' है? (Http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/)। –
@ मैथ्यू - अगर मैंने किया, तो मुझे कारखाने में SerializationInfo कैसे मिलेगा? उस समय तक बार के निजी कन्स्ट्रक्टर को बुलाया गया है, कारखाने से बार बनाने के लिए बहुत देर हो चुकी है, क्योंकि हम पहले ही बार कन्स्ट्रक्टर में हैं, और बार किसी भी मामले में बारफैक्टरी के बारे में नहीं जानते हैं। – tandersen