2017-01-24 18 views
16

के साथ हैंगफायर निर्भरता इंजेक्शन। मैं हैंगफायर में .NET कोर के डिफ़ॉल्ट निर्भरता इंजेक्शन का उपयोग कैसे कर सकता हूं?.net कोर

मैं हैंगफायर के लिए नया हूं और एक उदाहरण खोज रहा हूं जो एएसपीनेट कोर के साथ काम करता है।

+3

मुझे यकीन नहीं है कि स्टैक ओवरफ्लो के साथ क्या गलत है। कुछ लोग प्रश्न को समझने के बिना आपको वोट देने के लिए हमेशा तैयार रहते हैं। – eadam

उत्तर

5

जहां तक ​​मुझे पता है, आप .NET कोर निर्भरता इंजेक्शन का उपयोग उसी तरह की किसी अन्य सेवा के लिए कर सकते हैं।

आप एक सेवा है, जो नौकरियों निष्पादित करने के लिए होता है जो इतना

var jobId = BackgroundJob.Enqueue(x => x.SomeTask(passParamIfYouWish));

यहाँ की तरह क्रियान्वित किया जा सकता का उपयोग कर सकते कार्य सेवा वर्ग

public class JobService : IJobService 
{ 
    private IClientService _clientService; 
    private INodeServices _nodeServices; 

    //Constructor 
    public JobService(IClientService clientService, INodeServices nodeServices) 
    { 
     _clientService = clientService; 
     _nodeServices = nodeServices; 
    } 

    //Some task to execute 
    public async Task SomeTask(Guid subject) 
    { 
     // Do some job here 
     Client client = _clientService.FindUserBySubject(subject); 
    }  
} 

और में का एक उदाहरण है आपकी परियोजनाएं Startup.cs आप सामान्य

services.AddTransient< IClientService, ClientService>();

के रूप में निर्भरता जोड़ सकते हैं

सुनिश्चित नहीं हैं कि यह आपके सवाल का जवाब है या नहीं

+1

यह समाधान बॉक्स के ठीक बाहर काम कर रहा है। धन्यवाद –

19

GitHub https://github.com/gonzigonz/HangfireCore-Example पर पूर्ण उदाहरण देखें।
dotnet add package Hangfire.AspNetCore

  • एक JobActivator परिभाषित करके अपने आईओसी कॉन्फ़िगर करें:
    http://hangfirecore.azurewebsites.net/

    1. पर लाइव साइट वाकई Hangfire की कोर संस्करण है।

      public class HangfireActivator : Hangfire.JobActivator 
      { 
          private readonly IServiceProvider _serviceProvider; 
      
          public HangfireActivator(IServiceProvider serviceProvider) 
          { 
           _serviceProvider = serviceProvider; 
          } 
      
          public override object ActivateJob(Type type) 
          { 
           return _serviceProvider.GetService(type); 
          } 
      } 
      
    2. Startup.ConfigureServices विधि में एक सेवा के रूप अगला रजिस्टर hangfire: Startup.Configure विधि में

      services.AddHangfire(opt => 
          opt.UseSqlServerStorage("Your Hangfire Connection string")); 
      
    3. कॉन्फ़िगर hangfire नीचे डिफ़ॉल्ट asp.net कोर कंटेनर सेवा के साथ उपयोग के लिए config है। आपके प्रश्न के संबंध में, कुंजी हम अभी ऊपर परिभाषित नए HangfireActivator का उपयोग करने के लिए हैंगफायर को कॉन्फ़िगर करना है। ऐसा करने के लिए आपको IServiceProvider के साथ हैंगफायर प्रदान करना होगा और इसे Configure विधि के लिए पैरामीटर की सूची में जोड़कर हासिल किया जा सकता है। डि आप के लिए यह उपलब्ध कराने का ख्याल रखना होगा:

      public void Configure(
          IApplicationBuilder app, 
          IHostingEnvironment env, 
          ILoggerFactory loggerFactory, 
          IServiceProvider serviceProvider) 
      { 
          ... 
      
          // Configure hangfire to use the new JobActivator we defined. 
          GlobalConfiguration.Configuration 
           .UseActivator(new HangfireActivator(serviceProvider)); 
      
          // The rest of the hangfire config as usual. 
          app.UseHangfireServer(); 
          app.UseHangfireDashboard(); 
      } 
      
    4. जब आप एक नौकरी enqueue, इंटरफ़ेस का उपयोग करें। जब तक आपने इसे पंजीकृत नहीं किया है, तब तक इसे कॉन्सर्ट प्रकार न दें। आपको अपने आईओसी के साथ पंजीकृत प्रकार निर्दिष्ट करना होगा, अन्यथा हैंगफायर आपके प्रकार को नहीं ढूंढ पाएगा। उदाहरण के लिए कहते हैं कि तुम निम्नलिखित सेवाओं को पंजीकृत कर दिया:

      services.AddScoped<DbManager>(); 
      services.AddScoped<IMyService, MyService>(); 
      

    तो फिर तुम वर्ग के एक instantiated संस्करण के साथ DbManager enqueue सकता है:

    BackgroundJob.Enqueue(() => dbManager.DoSomething()); 
    

    आप नहीं कर सका हालांकि MyService के साथ ही। एक तत्काल संस्करण के साथ संलग्न करना असफल हो जाएगा क्योंकि DI विफल हो जाएगा क्योंकि केवल इंटरफ़ेस पंजीकृत है। इस प्रकार आप इस तरह से एनक्यू करेंगे:

    BackgroundJob.Enqueue<IMyService>(ms => ms.DoSomething());