2015-10-21 9 views
12

में Middleware में DbContext एक्सेस करना मैं जो मैंASP.NET 5

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    //... 
    app.UseAutologin(); 
    app.UseMvc(routes => 
    { 
     //... 

में जोड़ने तो यह पिछले मिडलवेयर है पहले Mvc खेलने में आता है अपने कस्टम मिडलवेयर लिखा था।

मेरे मिडलवेयर की Invoke विधि में मैं DbContext तक पहुंच (अप्रत्यक्ष रूप से) करना चाहता हूं।

InvalidOperationException:

public async Task Invoke(HttpContext context) 
    { 
    if (string.IsNullOrEmpty(context.User.Identity.Name)) 
    { 
     var applicationContext = _serviceProvider.GetService<ApplicationDbContext>(); 
     var signInManager = _serviceProvider.GetService<SignInManager<ApplicationUser>>(); 
     var result = await signInManager.PasswordSignInAsync(_options.UserName, _options.Password, true, false); 
    } 

    await _next(context); 
    } 

लगभग हर बार जब मैं निम्न अपवाद मिल का प्रयास करते हुए इसे कॉन्फिगर किया जा रहा है संदर्भ उपयोग करने के लिए बनाया गया था। DbContext उदाहरण OnConfiguring के अंदर उपयोग नहीं किया जा सकता है क्योंकि यह अभी भी इस बिंदु पर कॉन्फ़िगर किया जा रहा है।

अब यह स्पष्ट रूप से PasswordSignInAsync विधि द्वारा उठाया गया है। लेकिन मैं यह कैसे सुनिश्चित कर सकता हूं कि मॉडल ऐसी चीजों से पहले बनाया गया था?

शायद मैं पूरी तरह से स्पष्ट नहीं था: मैं DbContext स्वयं का उपयोग नहीं करना चाहता - PasswordSignInAsync उपयोगकर्ता और पासवर्ड की पुष्टि करते समय इसका उपयोग करता है।

+0

मैं कोई त्रुटि है । क्या आपको एक सुधार मिला है। – aguetat

+0

आप क्या हासिल करने की कोशिश कर रहे हैं? – mayu

उत्तर

5

क्या होगा यदि आप Invoke विधि के माध्यम से ApplicationDbContext और SignInManager<ApplicationUser> इंजेक्षन:

public async Task Invoke(HttpContext context, ApplicationDbContext applicationContext, SignInManager<ApplicationUser> signInManager) 
{ 
    if (string.IsNullOrEmpty(context.User.Identity.Name)) 
    { 
     var result = await signInManager.PasswordSignInAsync(_options.UserName, _options.Password, true, false); 
    } 

    await _next(context); 
} 

इस तरह से आप सेवाओं सही दायरे से हल कर रहे हैं। मुझे लगता है कि आप वास्तव में ApplicationDbContext कहीं भी उपयोग नहीं करते हैं, बस SignInManager। क्या आपको सचमुच इसकी जरूरत है?

+0

'साइनइन प्रबंधक' इसका उपयोग करता है, इसलिए मुझे त्रुटि क्यों मिलती है ... –

1

यह त्रुटि संभवतः होती है क्योंकि कोई भी मिडलवेयर सिंगलटन के रूप में कार्य करता है। आपको अपने मिडलवेयर में सदस्य चर का उपयोग करने से बचना होगा। कार्य आमंत्रण में इंजेक्ट करने के लिए स्वतंत्र महसूस करें, लेकिन इंजेक्शन मान को किसी सदस्य ऑब्जेक्ट में संग्रहीत न करें।

देखें: Saving HttpContext Instance in Middleware, Calling services in Middleware

मैं इस के चारों ओर अपने आप को प्राप्त करने के लिए, द्वारा एक वर्ग है कि मैं तो मेरे मिडलवेयर में अन्य तरीकों में पारित कर सकता है बनाने में सक्षम था:

public async Task Invoke(HttpContext context, IMetaService metaService) 
    { 
      var middler = new Middler 
      { 
       Context = context, 
       MetaService = metaService 
      }; 

      DoSomething(middler); 
    } 
संबंधित मुद्दे