2017-08-23 1 views
0

Je tente d'utiliser Quartz avec Autofac en raison de la bibliothèque Autofac.Extras.Quartz. Mais mon code tombe en panne Il est simple, mais il se bloque:Autofac.Extras.Quartz exemple de code se bloque

using Autofac; 
using Autofac.Extras.Quartz; 
using Quartz; 
using System; 

namespace Test1_netCore 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var builder = new ContainerBuilder(); 
      builder.RegisterModule(new QuartzAutofacFactoryModule()); 
      var container = builder.Build(); 
      IScheduler scheduler = container.Resolve<IScheduler>(); //crashes here 
      // 
     } 
    } 
} 

à l'exception:

Autofac.Core.DependencyResolutionException: 'An error occurred during the activation of a particular registration. 
See the inner exception for details. Registration: Activator = IScheduler (DelegateActivator), 
Services = [Quartz.IScheduler], 
Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, 
Sharing = Shared, 
Ownership = OwnedByLifetimeScope' 

Inner Exception 
MissingMethodException: Method not found: "Quartz.IScheduler Quartz.ISchedulerFactory.GetScheduler()". 

Cependant, cela fonctionne bien, quand je résous ISchedulerFactory et obtenir récipient de lui

using Autofac; 
using Autofac.Extras.Quartz; 
using Quartz; 
using System; 

namespace Test1_netCore 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var builder = new ContainerBuilder(); 
      builder.RegisterModule(new QuartzAutofacFactoryModule()); 
      var container = builder.Build(); 
      //IScheduler scheduler = container.Resolve<IScheduler>(); 
      ISchedulerFactory factory = container.Resolve<ISchedulerFactory>(); 
      IScheduler scheduler = factory.GetScheduler().Result; 
      // 
     } 
    } 
} 

Ce qui se produit? Je pense que j'ai mal compris quelque chose.

Répondre

1

Je l'ai compris: les assemblages Autofac.Extras.Quartz et Quartz étaient incompatibles. Autofac.Extras.Quartz (3.3.0) appelle la méthode ISchedulerFactory getScheduler() comme celui-ci

builder.Register(c => c.Resolve<ISchedulerFactory>().GetScheduler()) 

(https://github.com/alphacloud/Autofac.Extras.Quartz/blob/26f33fa3be91a077e9edfefbc53606ab2f2ffc95/src/Autofac.Extras.Quartz/QuartzAutofacFactoryModule.cs#L89)

Mais dans la signature pintes 3.0.0-alpha3 de cette méthode est

Task<IScheduler> GetScheduler(CancellationToken cancellationToken = default(CancellationToken)); 

(https://github.com/quartznet/quartznet/blob/bb682fe4c051b2120086170cf03ae5111832b29f/src/Quartz/ISchedulerFactory.cs#L47)

Cependant, je peux utiliser des versions avec approche dans le deuxième exemple de code dans mon questi sur, juste résoudre ISchedulerFactory puis getSchduler() manuellement. (J'ai vraiment besoin exactement de cette version de packeges car d'autres dépendances dans mon projet)

+0

Vous devriez accepter votre réponse pour fermer la question. – yorah