Autofac.Extras.Quartz 示例代码崩溃
Autofac.Extras.Quartz sample code crashes
由于 Autofac.Extras.Quartz 库,我试图将 Quartz 与 Autofac 一起使用。但是我的代码崩溃了
它很简单但它崩溃了:
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;
//
}
}
}
会发生什么?我想我严重误解了一些东西。
我弄明白了:Autofac.Extras.Quartz 和 Quartz 程序集不兼容。
Autofac.Extras.Quartz (3.3.0) 像这样调用 ISchedulerFactory 方法 getScheduler()
builder.Register(c => c.Resolve<ISchedulerFactory>().GetScheduler())
但在 Quarts 3.0.0-alpha3 中,此方法的签名是
Task<IScheduler> GetScheduler(CancellationToken cancellationToken = default(CancellationToken));
但是我可以在我的问题的第二个代码示例中将版本与方法一起使用,只需手动解析 ISchedulerFactory
然后 getSchduler()
即可。
(我真的需要这个版本的 packeges 因为我项目中的其他依赖项)
由于 Autofac.Extras.Quartz 库,我试图将 Quartz 与 Autofac 一起使用。但是我的代码崩溃了 它很简单但它崩溃了:
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;
//
}
}
}
会发生什么?我想我严重误解了一些东西。
我弄明白了:Autofac.Extras.Quartz 和 Quartz 程序集不兼容。 Autofac.Extras.Quartz (3.3.0) 像这样调用 ISchedulerFactory 方法 getScheduler()
builder.Register(c => c.Resolve<ISchedulerFactory>().GetScheduler())
但在 Quarts 3.0.0-alpha3 中,此方法的签名是
Task<IScheduler> GetScheduler(CancellationToken cancellationToken = default(CancellationToken));
但是我可以在我的问题的第二个代码示例中将版本与方法一起使用,只需手动解析 ISchedulerFactory
然后 getSchduler()
即可。
(我真的需要这个版本的 packeges 因为我项目中的其他依赖项)