2016-02-12 8 views
5

पर निर्भर है मैं या तो अनुरोध स्कोप्ड सेवा बदलना चाहता हूं या एक कस्टम मिडलवेयर परत में सेट करना चाहता हूं।Asp.Net कोर मिडलवेयर सेवा वर्तमान उपयोगकर्ता

विशेष रूप से, मैं Startup.cs में नीचे काल्पनिक उदाहरण की तरह कुछ करने के लिए सक्षम होना चाहते हैं:

public void ConfigureServices(IServiceCollection service) 
{ 
    service.AddScoped<IMyUserDependentService>((provider) => { 
     return new MyService()); 
    }); 
} 

public void Configure(...) { 

    //other config removed 

    app.Use(async (context, next) => { 

     var myService = context.ApplicationServices.GetService<IMyUserDependentService>(); 


     myService.SetUser(context.User.Identity.Name);//Name is Fred 

     next.Invoke(); 
    }); 
} 

फिर नियंत्रक में क्या यह:

public class HomeController: Controller 
{ 
    public HomeController(IMyUserDependentService myService) 
    { 
     //myService.UserName should equal Fred 
    } 
} 

समस्या यह है, यह नहीं करता है कि काम नहीं करता myService.UserName नियंत्रक में फ्रेड नहीं है, यह शून्य है। मुझे लगता है कि आईओसी कंटेनर नियंत्रक में एक नया उदाहरण बना रहा है, और मिडलवेयर में एक सेट का उपयोग नहीं कर रहा है।

यदि मैं सेवा के दायरे को क्षणिक में बदलता हूं, तो फ्रेड याद किया जाता है, लेकिन इससे मदद नहीं मिलती क्योंकि सेवा इस बात पर निर्भर करती है कि वर्तमान उपयोगकर्ता कौन है।

संक्षेप में, मुझे जो सेवा चाहिए उसे बनाने/संपादित करने के लिए वर्तमान उपयोगकर्ता (या अन्य वर्तमान अनुरोध चर) की आवश्यकता है, लेकिन मैं इसे काम करने में असमर्थ हूं।

अग्रिम धन्यवाद!

+0

"मुझे लगता है कि आईओसी कंटेनर नियंत्रक में एक नया उदाहरण बना रहा है, और मिडलवेयर में एक सेट का उपयोग नहीं कर रहा है।" आप 'IMyUserDependentService' कन्स्ट्रक्टर में ब्रेकपॉइंट डालकर इसे सत्यापित कर सकते हैं और देख सकते हैं कि अनुरोध के दौरान इसे एक से अधिक बार तुरंत चालू किया जाता है या नहीं। – danludwig

+0

दिलचस्प बात यह है कि नियंत्रक के लिए प्रत्येक बार एक नई सेवा बनाई जा रही है, लेकिन मिडलवेयर '.use' विधि के अंदर सेवा पिछले अनुरोध के समान ही है ..... wtf? –

+1

उस स्थिति में ऐसा लगता है कि "स्कोप" बनने से पहले आपके मिडलवेयर पाइपलाइन में कहीं है। – danludwig

उत्तर

3

क्या आपने context.RequestServices का उपयोग करने का प्रयास किया है?

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