5

हाल ही में मैंने एंटीटीफ्रेमवर्क की खोज के साथ रिपोजिटरी पैटर्न और यूनिटऑफवर्क की अवधारणा में खुदाई शुरू कर दी।ईएफ, यूओडब्ल्यू और रिपोजिटरी - वेबफॉर्म में यूनिटऑफवर्क का निपटान कब करें?

एक MVC उदाहरण के आधार पर अपने खुद के कार्यान्वयन बनाया गया है, जहां वे तो जैसे नियंत्रक से UnitOfWork निपटाने गया:

protected override void Dispose(bool disposing) 
{ 
    unitOfWork.Dispose(); 
    base.Dispose(disposing); 
} 

मैं MVC में सब पर, और बहुत वेबफ़ॉर्म में नए रूप में अच्छी तरह नहीं कर रहा हूँ, लेकिन मुझे लगता है कि यूनिटऑफवर्क को "सबकुछ" के रूप में निपटाने के लिए वे नियंत्रक निपटान विधि को ओवरराइड कर रहे हैं।

मूल रूप से मैं अपने एएसपी.नेट वेबफॉर्म वेबसाइट में एक ही अवधारणा को कार्यान्वित करना चाहता हूं और यूनिटऑफवर्क का निपटान करना चाहता हूं जिसका उपयोग पृष्ठ के कोड के पीछे पृष्ठ के निपटारे के साथ किया जाता है।

मैंने इसे जीवन चक्र से पृष्ठ_Unload ईवेंट में जोड़ने पर विचार किया, लेकिन मुझे यकीन नहीं था कि ऐसा करने का यह सही तरीका है क्योंकि मैंने पहले ऐसी चीजों से गड़बड़ नहीं की है। मेरा विचार इस प्रकार है:

protected void Page_Unload(object sender, EventArgs e) 
{ 
    unitOfWork.Dispose(); 
    base.Dispose(); 
} 

मैं इसे सुरक्षित रूप से कैसे प्राप्त कर सकता हूं, और क्या मैं सही रास्ते पर हूं?

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/2750111/when-to-call-dispose-in-entity-framework http://stackoverflow.com/questions/4295975/repository-pattern-in- इकाई-ढांचा -4-कब-चाहिए-हम-निपटान http://stackoverflow.com/questions/10777630/questions-about-entity-framework-context-lifetime http://stackoverflow.com/questions/1698628/entity- फ्रेमवर्क-एंड-ऑब्जेक्ट-कॉन्टेक्ट-लाइफस्टाइल-इन-एएसपी-नेट-एमवीसी –

+0

उनको इंगित करने के लिए धन्यवाद, वे शायद गहरे ज्ञान वाले किसी के लिए सहायक होंगे, जिसे वह चाहता है उसे लागू करने के लिए केवल थोड़ी सी जानकारी चाहिए। दुर्भाग्य से मुझे नहीं। – Peter

+0

असल में, वे आप थे और अन्य लोग जांच सकते हैं कि प्रश्न उनके जैसा ही है और यदि इस सवाल को बंद कर दें। क्या किसी भी प्रश्न के उत्तर में से कोई भी जवाब आपकी मदद नहीं करता है? –

उत्तर

4

सबसे पहले: पहिया का आविष्कार न करें।

उपयोग निर्भरता इंजेक्शन फ्रेमवर्क की तरह: StructureMap, Ninject, एकता, आदि ....

आपका UOW एक वेब अनुरोध और की शुरुआत के साथ शुरू किया जाना चाहिए निपटारा जब अनुरोध समाप्त हो गया है।

दूसरे शब्दों में: अनुरोध शुरू होने पर ईएफ का डेटाकॉन्टेक्स्ट प्रारंभ किया जाना चाहिए। फिर आप इसे कहीं भी (सत्र, ...) स्टोर कर सकते हैं, और इसे उस अनुरोध के लिए पुन: उपयोग किया जा सकता है। प्रति अनुरोध DataContext का एक उदाहरण।

लेकिन यदि आप इसे स्वयं करने का प्रयास करते हैं, तो आप एक निर्भरता इंजेक्शन ढांचे का उपयोग करके गलत तरीके से हैं, यह इतना आसान बना देगा।

ढांचा आपके डेटाकॉन्टेक्स्ट (यूओडब्लू) के जीवनकाल को संभाल सकता है।

+0

उत्तर के लिए धन्यवाद, मैं निर्भरता इंजेक्शन ढांचे में खुदाई कर रहा हूं जो इस समय मेरे लिए एक पूर्ण अजनबी हैं। जब तक मैं शोध नहीं कर लेता, तब तक मैं इसे थोड़ा और छोड़ दूंगा, शायद किसी को जोड़ने के लिए कुछ है। – Peter

+0

निश्चित रूप से। क्योंकि मुझे इन विषयों को वास्तव में पसंद है, मैं इन मामलों के बारे में दूसरों से सुनना चाहता हूं। –

+0

ठीक है, मैंने यूनिटऑफवर्क खुद को शुरू करने के साथ शुरू किया। मैंने देखा कि BeginRequest घटना सभी स्थैतिक फ़ाइलों के लिए भी आग लगती है जो यूओडब्ल्यू के दोहराव और अनियंत्रित प्रारंभिक कारण बनती है। क्या डीआई फ्रेमवर्क मेरे लिए इस समस्या को हल करेगा (वेबफॉर्म)? और दूसरा कामकाज क्या होगा? – Peter

2

आप परतों और घटकों में अपने सॉफ्टवेयर को विभाजित करना चाहिए ...

यूआई -> नियंत्रक -> सेवा -> दाल

जैसे

UI.Submit -> Controller.SaveUserInfo -> UsersManagementService.SaveUserInfo ->

public void SaveUserInfo(User user) 
{ 
    using (var uow = new Uow()) 
    { 
     var dbUser = uow.Users.GetByKey(user.Id); 
     if (dbUser == null) 
     { 
      // TODO: 
     } 

     dbUser.Name = user.Name; 
     dbUser.Address = user.Address; 
     // Or use a framework for injecting properties 

     uow.SaveAndAcceptChanges(); 
    } 
} 

तुम भी जैसे certiain सेवा तरीकों में क्वेरी तर्क प्राप्त कर सकते हैं

public User GetUsersMatching(Func<IQueryable<User>, IQueryable<User>> query) 
{ 
    using (var uow = new Uow()) 
    { 
     var users = query(uow.Users).ToList(); 
     return users; 

     // For this to work using POCOs you may need to disable proxy creation 
    } 
} 

हालांकि, इस परीक्षण को और अधिक जटिल बना देता है और सेवा के उपभोक्ताओं संस्थाओं के लिए सीमाओं और LINQ की सर्वोत्तम प्रथाओं को समझने के लिए की आवश्यकता है।

मैं भी एक ही डोमेन पार "भंडार" क्वेरी की आवश्यकता होती है और में join खंड की आवश्यकता होती है से शुद्ध शैक्षिक भंडार-प्रति-आधार प्रकार पैटर्न का उपयोग नहीं करने की सलाह देते, जैसा कि अक्सर कुशलतापूर्वक को उपभोग विभिन्न प्रकार के डेटा अपने LINQ या कई प्रश्नों का नतीजा एक साथ मिलाकर इसे एक साफ परिणाम के रूप में लौटने से पहले दोबारा बदल दिया जाता है।

इसके बजाय अपनी सेवाओं का डोमेन-speicifc-repositories के रूप में व्यवहार करें जहां आप विभिन्न प्रकार के आउटपुट प्राप्त कर सकते हैं। या दूसरे शब्दों में, अपने एमवीसी के तहत और अपने ईएफ के ऊपर एसओए का उपयोग करें।