5

के दौरान डीबीकॉन्टेक्स्ट का निपटारा किया गया है" मुझे एक बहुत ही जटिल समस्या है। मैं अपने एएसपी.नेट एमवीसी 5 प्रोजेक्ट में FluentValidation.MVC का उपयोग कर रहा हूं। इसमें, मैं यह जांचने के लिए एक रिपोजिटरी पैटर्न का उपयोग करता हूं कि उपयोगकर्ता का ईमेल पता डुप्लिकेट नहीं है या नहीं। मुद्दा वास्तव में भंडार पैटर्न नहीं है;सरल इंजेक्टर "ऑपरेशन पूरा नहीं किया जा सकता क्योंकि एमबीसी सत्यापन

public class SomeRepository 
{ 
    //IEFContext is something I modified the T4 template to generate 
    public SomeRepository(IEFContext context) 
    { 
    _context = context; 
    } 
} 

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

Dim httpLifecycle = New SimpleInjector.Integration.Web.WebRequestLifestyle(True) 
container.Register(of IEFContext, EFContext)(httpLifecycle) 

यहां ऐप के साथ कोई समस्या नहीं है, केवल सत्यापन। जब सर्वर पोस्ट ऑपरेशन प्राप्त करता है, तो मुझे जो त्रुटि मिल रही है वह है "ऑपरेशन पूरा नहीं किया जा सकता क्योंकि डीबीकॉन्टेक्स्ट का निपटारा किया गया है"। ऐसा प्रतीत होता है कि मैं किसी भी ईएफ-संबंधित कोड का उपयोग FluentValidation विशेषता में नहीं कर सकता, जो प्रति वेब अनुरोध आधार पर ईएफ संदर्भ का उपयोग करता है। मान्यता विशेषता के बारे में कुछ खास नहीं है, जो करता है:

public class Val : AbstractValidator<Entity> 
{ 
    public Val() 
    { 
     _repos = Container.GetInstance<ISomeRepos>(); 
     RuleFor(i => i.Email).Must((o, v) => 
     { 
      _repos.HasDistinctEmail(o.ID, v); 
     } 
    } 
} 

संदर्भ पिछले अनुरोध के साथ मर जाना चाहिए था के बाद से HttpContext.Items में संग्रहीत। कोई विचार क्या चल रहा है? मुझे WebRequestLifecycle पर सही सेट करके पता है, मैं अनुरोध अंत पर ईएफ संदर्भ का निपटारा कर रहा हूं। मुझे लगता है कि वांछनीय होगा।

उत्तर

4

मेरे सबसे अच्छा शर्त है कि Val वर्ग का एक उदाहरण AppDomain (एक सिंगलटन), जिसका अर्थ है कि इसके निर्माता सिर्फ एक बार कहा जाता है की अवधि के लिए कैश किया गया है और इसलिए यह केवल एक एकल ISomeRepos निराकरण, करने के लिए है कि रेपो के कारण है सिंगलटन को भी बढ़ावा दिया जाना चाहिए (और इसके साथ, इसकी सभी निर्भरताओं)।

त्वरित सुधार सरल है, प्रतिनिधि अंदर GetInstance कॉल के लिए कदम:

public Val() 
{ 
    RuleFor(i => i.Email).Must((o, v) => 
    { 
     repos = Container.GetInstance<ISomeRepos>(); 
     repos.HasDistinctEmail(o.ID, v); 
    } 
} 
+0

कि यह था! धन्यवाद। –

संबंधित मुद्दे