2017-08-23 5 views
0

Autofac.Extras.Quartzライブラリのために、AutofacでQuartzを使用しようとしています。しかし、私のコードは クラッシュすることは簡単ですが、それはクラッシュ:例外Autofac.Extras.Quartzサンプルコードがクラッシュする

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 
      // 
     } 
    } 
} 

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()". 

しかし、これは私がISchedulerFactoryを解決し、それ

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; 
      // 
     } 
    } 
} 

からコンテナを取得するときに、[OK]を実行します何が起こるのですか?私は何かを強く誤解していると思う。

答えて

1

わかりました:Autofac.Extras.QuartzとQuartzアセンブリは互換性がありませんでした。 Autofac.Extras.Quartz(3.3.0)は、この

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

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

ようISchedulerFactory方法getScheduler()を呼び出ししかし、クォーツ、この方法の3.0.0-アルファ3シグネチャは

Task<IScheduler> GetScheduler(CancellationToken cancellationToken = default(CancellationToken)); 
あります

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

しかし、私のクエストでは、2番目のコードサンプルのアプローチとバージョンを併用することができます単にISchedulerFactoryを解決してから手動でgetSchduler()を解決してください。 (私のプロジェクトの他の依存関係のため、このバージョンのpackegesが本当に必要です)

+0

質問を閉じるには答えを受け入れる必要があります。 – yorah

関連する問題