c# मुझे IHostedService में DbContext इंस्टेंस को कैसे इंजेक्ट करना चाहिए?



asp.net .net (1)

सवाल

मुझे एक DbContext में एक IHostedService उदाहरण को कैसे (मानक निर्भरता इंजेक्शन का उपयोग करके) इंजेक्षन करना चाहिए?

मैंने क्या कोशिश की है

वर्तमान में मेरे पास IHostedService क्लास है जो MainContext एक MainContext ( DbContext से DbContext ) उदाहरण DbContext

जब मैं आवेदन प्राप्त करता हूं तो मुझे यह मिलता है:

सिंगलटन 'Microsoft.Extensions.Hosting.IHostedService' से स्कूप्ड सेवा 'Microsoft.EntityFrameworkCore.DbContextOptions' का उपभोग नहीं कर सकता।

इसलिए मैंने निर्दिष्ट करके DbContextOptions क्षणिक बनाने की कोशिश की:

services.AddDbContext<MainContext>(options => 
                options.UseSqlite("Data Source=development.db"), ServiceLifetime.Transient);

मेरे Startup क्लास में।

लेकिन त्रुटि वही रहती है, भले ही, इस हल DbContextOptions गए DbContextOptions मुद्दे के अनुसार DbContextOptions पास हो, उसी जीवनकाल को AddDbContext कॉल में निर्दिष्ट किया जाना चाहिए।

मैं डेटाबेस संदर्भ को एक सिंगलटन नहीं बना सकता हूं अन्यथा इसके लिए समवर्ती कॉल समवर्ती अपवादों को प्राप्त करेगा (इस तथ्य के कारण कि डेटाबेस संदर्भ थ्रेड सुरक्षित होने की गारंटी नहीं है)।


होस्ट की गई सेवाओं के अंदर सेवाओं का उपयोग करने का एक अच्छा तरीका यह है कि जरूरत पड़ने पर एक गुंजाइश बनाई जाए। यह उन सेवाओं / डीबी संदर्भों आदि का उपयोग करने की अनुमति देता है जिनके साथ वे आजीवन विन्यास के साथ स्थापित होते हैं। एक स्कोप नहीं बनाने से थ्योरी लीड पैदा हो सकती है जिससे सिंगलटन डीबोन्टेक् ट और अनुचित संदर्भ पुन: उपयोग हो सके (डीएफकोटेक्स्ट पूल के साथ ईएफ कोर 2.0)।

ऐसा करने के लिए, एक IServiceScopeFactory इंजेक्षन और जरूरत पड़ने पर एक गुंजाइश बनाने के लिए इसका उपयोग करें। फिर इस दायरे से आपको जो भी निर्भरता चाहिए, उसका समाधान करें। यह आपको कस्टम सेवाओं को पंजीकृत करने की भी अनुमति देता है क्योंकि आपको स्कोप की गई निर्भरता को होस्ट की गई सेवा से तर्क को स्थानांतरित करना चाहिए और केवल कुछ काम को ट्रिगर करने के लिए होस्ट की गई सेवा का उपयोग करना चाहिए (जैसे नियमित रूप से एक कार्य को ट्रिगर करना - यह नियमित रूप से स्कोप बनाएगा, कार्य सेवा बनाएँ इस दायरे को भी db संदर्भ इंजेक्ट किया जाता है)।

public class MyHostedService : IHostedService
{
    private readonly IServiceScopeFactory scopeFactory;

    public MyHostedService(IServiceScopeFactory scopeFactory)
    {
        this.scopeFactory = scopeFactory;
    }

    public void DoWork()
    {
        using (var scope = scopeFactory.CreateScope())
        {
            var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();
            
        }
    }
    
}




.net-core