8

मेरे पास एक एमवीसी 3 प्रोजेक्ट है जो निनजेक्ट, एंटिटी फ्रेमवर्क और सर्विस लेयर के साथ यूनिट ऑफ वर्क पैटर्न का उपयोग करता है।कार्य/थ्रेड के साथ निंजा स्कोप समस्या

मेरा AsyncService क्लास में एक फ़ंक्शन है जो पृष्ठभूमि कार्य शुरू करता है, उदाहरण के तौर पर, उपयोगकर्ता को उपयोगकर्ता संग्रह में जोड़ता है। मेरी वर्तमान समस्या यह है कि डीबीकॉन्टेक्स्ट का निपटारा करने में त्रुटि होने से पहले कार्य केवल कुछ सेकंड के लिए सही ढंग से चलता है। मेरा डेटाबेस संदर्भ, जिसे निनजेक्ट इनरक्वैस्टस्कोप() से इंजेक्शन दिया गया है, ऐसा लगता है कि इनरक्वैस्टस्कोप() इसे HttpContext से जोड़ता है।

मैंने इनट्रेडस्कोप() के बारे में पढ़ा है, हालांकि मुझे यकीन नहीं है कि यह मेरे एमवीसी प्रोजेक्ट में इसे कैसे कार्यान्वित किया जाए।

मेरा प्रश्न है: मेरे कार्य में निनजेक्ट का उपयोग करने का सही तरीका क्या है? तो यह इस मामले में नहीं किया जा सकता

public class AsyncService 
{ 
    private CancellationTokenSource cancellationTokenSource; 
    private IUnitOfWork _uow; 
    public AsyncService(IUnitOfWork uow) 
    { 
     _uow = uow; 
    } 
    public void AsyncStartActivity(Activity activity) 
    { 
    ...snip... 
     this.cancellationTokenSource = new CancellationTokenSource(); 
     var cancellationToken = this.cancellationTokenSource.Token; 
     var task = Task.Factory.StartNew(() => 
      { 
       foreach (var user in activity.UserList) 
       { 
        this._uow.UserRepository.Add(new User() {UserID = user}); 
       } 
       this._uow.Save(); 
      }, cancellationToken); 
    ...snip... 
    } 
} 

उत्तर

5

InRequestScope 'घ वस्तुओं के लिए एक अनुरोध के अंत में Dispose घ कर रहे हैं। InThreadScope भी फिट नहीं है क्योंकि कई कार्यों के लिए यूओडब्ल्यू का पुन: उपयोग करेगा।

हालांकि आप क्या कर सकते हैं हालांकि AsyncService को नामांकितस्कोप एक्सटेंशन का उपयोग करने के भीतर सभी ऑब्जेक्ट्स के लिए स्कोपिंग ऑब्जेक्ट के रूप में घोषित किया गया है।

देखें http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

+3

वहाँ एक नमूना कोड है? जेसन, जहां आप इसे काम करने में सक्षम हैं? मुझे एक ही समस्या है और लिंक के बाद मदद नहीं मिली है। –

+0

मेरे पास यह वही समस्या है, मुझे इस परिदृश्य के लिए कुछ नमूना कोड देखना अच्छा लगेगा। –

0

यह एक गंदा समाधान है कि मैं पहले उपयोग किए गए ChildKernel प्लगइन का उपयोग कर रहा है (मुझे लगता है कि नाम गुंजाइश अधिक स्वच्छ होगा)। मूल रूप से मैं बाल कर्नेल बना देता हूं, और यूओडब्लू से संबंधित सब कुछ बच्चे कर्नेल में सिंगलटन के रूप में करता हूं। मैं फिर प्रत्येक कार्य के लिए एक नया बच्चा कर्नेल बना देता हूं, यूओडब्ल्यू को संभालता हूं, और प्रतिबद्ध या रोलबैक करता हूं।

IAsyncTask, 1 विधि के साथ एक अंतरफलक है Execute()

private Task void ExecuteTask<T>() where T:IAsyncTask 
{ 

     var task = Task.Factory.StartNew(() => 
              { 
      var taskKernel = _kernel.Get<ChildKernel>(); 
      var uow = taskKernel.Get<IUnitOfWork>(); 
      var asyncTask = taskKernel.Get<T>(); 

      try 
      { 
       uow.Begin(); 
       asyncTask.Execute(); 
       uow.Commit(); 
      } 
      catch (Exception ex) 
      { 
       uow.Rollback(); 
       //log it, whatever else you want to do 
      } 
      finally 
      { 
       uow.Dispose(); 
       taskKernel.Dispose(); 
      } 
     }); 
     return task; 
} 
संबंधित मुद्दे