2012-03-07 13 views
5

मैं एक ऐसी सेवा को लागू करने की कोशिश कर रहा हूं जो क्वार्ट्ज.Net के आधार पर नौकरियां चलाएगी। नौकरियों में आईरिपोजिटरी <> जैसी निर्भरता हो सकती है और भंडार कार्यान्वयन में एनएचबीरनेट आइसियाशन लगाया जाएगा। (क्वार्ट्ज विंडोज सेवा में होस्ट किया जाएगा)। जॉब्स को IJob फैक्ट्री कार्यान्वयन के माध्यम से हल किया जाता है जो हल करने के लिए निनजेक्ट का उपयोग करता है (वर्तमान में एक IServiceLocator कार्यान्वयन में लपेटा गया है)।क्वार्ट्ज.नेट, एनएच आईएसशन और निनजेक्ट स्कोप

नौकरी स्कोप

मैं गुंजाइश नौकरी प्रति ISession ताकि नौकरी प्रति बनाई गई एक सत्र कि कई IRepository <> के में इस्तेमाल किया जा सकता है के लिए Ninject उपयोग करने में सक्षम होना चाहते हैं।

यह सुनिश्चित नहीं है कि यह संभव है लेकिन मुझे आश्चर्य है कि किसी के पास इसका अनुभव है या नहीं?

क्या मैं किसी भी तरह से कर्नेल.इनस्कोप (???) द्वारा उपयोग किए जाने वाले दायरे को बनाने के लिए नौकरी संदर्भ का उपयोग कर सकता हूं।

Quartz.Net IJobFactory:

public class JobFactory : IJobFactory 
{ 
    readonly IServiceLocator locator; 

    public JobFactory(IServiceLocator locator) 
    { 
     this.locator = locator; 
    } 

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) 
    { 
     try 
     {    
      var jobDetail = bundle.JobDetail; 
      var jobType = jobDetail.JobType; 

      return (IJob)locator.Resolve(jobType); 
     } 
     catch (Exception e) 
     { 
      var se = new SchedulerException("Problem instantiating class", e); 
      throw se; 
     } 
    } 
} 

Ninject बाइंडिंग:

 //Service Locator 
     Bind<IServiceLocator>().To<NinjectAdapter>(); 

     //Quartz Bindings 
     Bind<IJobFactory>().To<JobFactory>(); 

     //NHibernate Bindings 
     Bind<ISessionFactory>().ToMethod(ctx => ctx.Kernel.Get<NHibernateConfiguration>().BuildSessionFactory()).InSingletonScope(); 
     Bind<ISession>().ToMethod(ctx => ctx.Kernel.Get<ISessionFactory>().OpenSession());// ToDo: Figure out how to scope session 

     //Repository Bindings 
     Bind(typeof (IRepository<>)).To(typeof (ReadWriteRepository<>)); 

मुख्य निष्पादन:

 InitializeIoC(); 
     scheduler = schedulerFactory.GetScheduler(); 
     scheduler.JobFactory = ServiceLocator.Resolve<IJobFactory>(); 
     InitializeJobs(); 
     scheduler.Start(); 

उदाहरण नौकरी:

public class TestJob3 : IJob 
{ 
    private readonly IRepository<Customer> repo; 
    private readonly IRepository<Order> orderRepo; 

    public TestJob3(IRepository<Customer> repo, IRepository<Order> orderRepo) 
    { 
     //orderRepo and repo should have the same ISession 

     this.repo = repo; 
     this.oderRepo = orderRepo; 
     System.Diagnostics.Debug.WriteLine("Job 3 Created"); 
    } 

    #region Implementation of IJob 

    public void Execute(IJobExecutionContext context) 
    { 
     System.Diagnostics.Debug.WriteLine("Job 3 Executing"); 
     using (var scope = new TransactionScope()) 
     { 
      var customer = repo.GetById(1); 
      customer.Name = "Blue Goats"; 
      repo.Save(customer); 
      scope.Complete(); 
     } 
    } 

    #endregion 
} 

** भंडार स्निपेट: **

public class ReadWriteRepository<TEntity> : IRepository<TEntity> where TEntity : class, IRootEntity 
{ 
    private readonly ISession session; 

    public ReadWriteRepository(ISession session) 
    { 
     this.session = session; 
    } 

    public virtual TEntity GetById(int id) 
    { 
     var entity = session.Get<TEntity>(id); 
     return entity; 
    } 

    public virtual TEntity Save(TEntity entity) 
    { 
     session.SaveOrUpdate(entity); 
     return entity; 
    } 
} 

समय देने के लिए धन्यवाद!

अद्यतन मैं Remo के सुझाव का उपयोग कर समाप्त हो गया और InCallScope() का उपयोग कर रहा:

Bind<ISession>().ToMethod(ctx => ctx.Kernel.Get<ISessionFactory>().OpenSession()).InCallScope(); 

तरह से मैं (? सही है या नहीं) "प्रारंभिक" से सब कुछ है इसके बारे में सोचना पसंद मिल निर्भरता पेड़ भर एक ही आइटम पुनः उपयोग कर लेता

+1

क्या आप अपना समाधान पोस्ट कर सकते हैं? मैं एक ही मुद्दे के साथ हूँ। –

उत्तर

2
+0

मैं वर्तमान में एक सक्रियण ब्लॉक का उपयोग कर रहा हूं जो काम करता प्रतीत होता है लेकिन मैं इनकॉलस्कोप एक्सटेंशन को आज़मा दूंगा। धन्यवाद! –

+0

रेमो, क्या आप सक्रियण ब्लॉक का उपयोग करके अपना समाधान पोस्ट कर सकते हैं? –

+0

@MuriloLima मुझे सक्रियण ब्लॉक का उपयोग करने के लिए इसका कोई समाधान नहीं है। मैं इसका उपयोग नहीं करता। –

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