में सिंगलटन प्रति कॉल संदर्भ (वेब अनुरोध) कुछ दिन पहले मुझे एएसपी.Net थ्रेडिंग के साथ यह समस्या थी। मैं प्रति वेब अनुरोध एक सिंगलटन ऑब्जेक्ट चाहता था। मुझे वास्तव में काम की मेरी इकाई के लिए इसकी ज़रूरत है। मैं प्रति वेब अनुरोध के काम की इकाई को तुरंत चालू करना चाहता था ताकि पहचान मानचित्र अनुरोध के माध्यम से मान्य हो। इस तरह मैं अपने स्वयं के IUnitOfWork को अपने भंडार वर्गों में पारदर्शी रूप से इंजेक्ट करने के लिए एक आईओसी का उपयोग कर सकता हूं, और मैं क्वेरी के लिए एक ही उदाहरण का उपयोग कर सकता हूं और फिर मेरी इकाइयों को अपडेट कर सकता हूं।यूनिटी
चूंकि मैं एकता का उपयोग कर रहा हूं, मैंने गलती से PerThreadLifeTimeManager का उपयोग किया। मुझे जल्द ही एहसास हुआ कि एएसपी.Net थ्रेडिंग मॉडल उस चीज़ का समर्थन नहीं करता है जिसे मैं स्वीकार करना चाहता हूं। असल में यह एक थैडपूल का उपयोग करता है और थ्रेड को रीसायकल करता है, और इसका मतलब है कि मुझे प्रति यूनिटऑफवर्क मिल जाता है !! हालांकि, मैं जो चाहता था वह प्रति वेब अनुरोध के काम की एक इकाई थी।
कुछ गुगल ने मुझे this great post दिया। वही था जो मैं चाहता था; एकता भाग को छोड़कर जो आसानी से परेशान था।
public class PerCallContextLifeTimeManager : LifetimeManager
{
private const string Key = "SingletonPerCallContext";
public override object GetValue()
{
return CallContext.GetData(Key);
}
public override void SetValue(object newValue)
{
CallContext.SetData(Key, newValue);
}
public override void RemoveValue()
{
}
}
और निश्चित रूप से मैं इस का उपयोग इस के समान एक कोड के साथ काम करने की मेरी यूनिट रजिस्टर करने के लिए:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
आशा है कि यह किसी की बचत होती है
यह एकता के लिए PerCallContextLifeTimeManager के लिए मेरे कार्यान्वयन है थोड़ा सा समय
अच्छा समाधान। यदि मैं कर सकता हूं, तो मैं इसे "CallContextLifetimeManager" में नाम देने की अनुशंसा करता हूं क्योंकि वेब अनुरोध संभवतः संभावित अनुप्रयोगों में से एक हैं। –
सच है, मैंने इसे प्रतिबिंबित करने के लिए पाठ और कोड अपडेट किया है। धन्यवाद। –
+1 बहुत उपयोगी। – MrDustpan