एक .Net कोर 3 वर्कर सर्विस में ऐप सेटिंग कैसे सेट करें


22

मैं appsettings.json in .Net Core 3 को पढ़ने के बारे में कई ट्यूटोरियल और SO प्रश्न (जैसे ऐप सेटिंग्स .Net कोर ) देख रहा हूं और वर्कर सेवा के साथ काम करते समय मुझे कोई संकेत नहीं मिल सकता है। कोई स्टार्टअप विधि नहीं है। इसके बजाय, मेरे पास मुख्य विधि के साथ एक Program.cs है:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

मैं .net Core 3 में एक कार्यकर्ता सेवा परियोजना में appsettings.json फ़ाइल से पढ़ने के बारे में कैसे जाना है?

मैंने एक कस्टम WCF क्लाइंट के साथ एक संदर्भ जोड़ा है जिसे मैंने .Net v4.8 और एक अन्य परियोजना के साथ बनाया है जिसमें पूरे समाधान के बीच बस सभी बसाइन्स डोमेन ऑब्जेक्ट साझा हैं। मेरा समाधान मुख्य रूप से .Net v4.8 है और मैं वर्कर सर्विस का उपयोग करना चाहता हूं। क्लाइंट प्रोजेक्ट कोड द्वारा आंतरिक रूप से WCF क्लाइंट बनाता है ताकि सभी बाइंडिंग और समापन बिंदु कॉन्फ़िगर करने योग्य हों। यदि यह एक .Net v4.8 परियोजना थी, तो मैं निम्नलिखित को app.config में जोड़ दूंगा:

<appSettings>
    ...
    <add key="AminServiceUri" value="http://localhost:45108/ServiceHost/v1/AminService.svc" />
    <add key="BillServiceUri" value="http://localhost:45108/ServiceHost/v1/BillService.svc" />
    <add key="CustomerServiceUri" value="http://localhost:45108/ServiceHost/v1/CustomerService.svc" />
    <add key="EpayServiceUri" value="http://localhost:45108/ServiceHost/v1/EpayService.svc" />
    <add key="FinanceServiceUri" value="http://localhost:45108/ServiceHost/v1/FinanceService.svc" />
    <add key="GrpServiceUri" value="http://localhost:45108/ServiceHost/v1/GrpService.svc" />
    <add key="MetaServiceUri" value="http://localhost:45108/ServiceHost/v1/MetaService.svc" />
    <add key="ReportServiceUri" value="http://localhost:45108/ServiceHost/v1/ReportService.svc" />
    <add key="ServiceInfoServiceUri" value="http://localhost:45108/ServiceHost/v1/ServiceInfoService.svc" />
    <add key="UsersServiceUri" value="http://localhost:45108/ServiceHost/v1/UsersService.svc" />
    ...
    <add key="ExcessiveLogging" value="false" />
    ...
</appSettings>

अब मुझे इन सेटिंग्स को नए JSON प्रारूप में होना चाहिए और उन्हें पढ़ना होगा।

संपादित करें

यह एक ताजा परियोजना है। कार्यकर्ता कुछ नहीं कर रहा है:

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> logger;

    public Worker(ILogger<Worker> logger)
    {
        this.logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(5000, stoppingToken);
        }
    }
}

और यहां बताया गया है कि मुझे यह प्रोजेक्ट किस प्रकार मिलता है:

कार्यकर्ता सेवा

जवाबों:


36

यदि उदाहरण के लिए श्रमिक वर्ग को आपके एपसेटिंग में संग्रहीत कुछ डेटा तक पहुंच की आवश्यकता है

public class Worker : BackgroundService {
    private readonly ILogger<Worker> logger;
    private readonly WorkerOptions options;

    public Worker(ILogger<Worker> logger, WorkerOptions options) {
        this.logger = logger;
        this.options = options;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
        while (!stoppingToken.IsCancellationRequested) {
            //do something that uses options

            logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(5000, stoppingToken);
        }
    }
}

जहां WorkerOptionsकॉन्फ़िगरेशन से आपके मूल्यों को संग्रहीत करता है।

public class WorkerOptions {
    public string AminServiceUri { get; set; }
    public string BillServiceUri { get; set; }

    //... other properties
}

जो मानता है appsettings.json फ़ाइल में संबंधित कुंजी है

{
  "WCF": {
    "AminServiceUri":"http://localhost:45108/ServiceHost/v1/AminService.svc",
    "BillServiceUri":"http://localhost:45108/ServiceHost/v1/BillService.svc",

    //...other key-value pairs
  },
  "Logging": {
    "ExcessiveLogging": false
  }

}

डिफ़ॉल्ट रूप Host.CreateDefaultBuilderसे सामान्य कॉन्फ़िगरेशन (appsettings.json et al) सेट करेगा।

hostContext.Configurationउस IConfigurationउदाहरण को प्राप्त करने के लिए उपयोग करें जिसका उपयोग वांछित सेटिंग्स तक पहुंचने के लिए किया जा सकता है और इसके लिए दृढ़ता से टाइप किए गए ऑब्जेक्ट मॉडल को जोड़ सकता है। उस वस्तु को सेवा संग्रह में जोड़ें ताकि जहां जरूरत हो वहां उसे इंजेक्ट किया जा सके

उदाहरण के लिए

public class Program {
    public static void Main(string[] args) {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) => {
                IConfiguration configuration = hostContext.Configuration;

                WorkerOptions options = configuration.GetSection("WCF").Get<WorkerOptions>();

                services.AddSingleton(options);

                services.AddHostedService<Worker>();
            });
}

जब कार्यकर्ता बनाया जा रहा है तो उसे अपनी आवश्यक निर्भरता के साथ इंजेक्ट किया जाएगा।

ASP.NET कोर में संदर्भ विन्यास


यह जवाब बहुत सही है। यह ऐप-सेटिंग्स से डेटा पढ़ने का सही तरीका प्रदान करता है।
विघ्नेश

आप IConfigurationकस्टम क्लास बनाने के बजाय उपयोग कर सकते हैं
शिमोन लेबोविट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.