Tôi đang cố gắng để có được Quartz.net (2.1.2) để làm việc với một container IoC (autofac), như tôi có dịch vụ tôi cần phải sử dụng trong lịch trình công việc. Tôi đã tìm thấy các bài viết tương tự về chủ đề này, nhưng tôi dường như không thể tìm thấy một bài đăng với một ví dụ đăng ký cụ thể cho autofac.Làm thế nào để tạo một công việc của Quartz.NET yêu cầu tiêm với autofac
Các bài giao dịch sau với cùng một vấn đề tôi đang gặp khó:
How to schedule task using Quartz.net 2.0?
Tuy nhiên, phần Tôi tin rằng tôi đang thiếu là khi câu trả lời nói "Và đừng quên đăng ký công việc trong container IoC ". Tôi không chắc chắn làm thế nào để làm điều này chính xác, như tất cả mọi thứ tôi đã cố gắng cho đến nay đã không làm việc.
Trong ví dụ sau, "HelloJob" sẽ chạy, nhưng bất cứ khi nào tôi cố gắng tiêm releaseService vào "ReleaseJob" nó từ chối chạy.
Cập nhật: Tôi đã đánh dấu mã trong phần DependencyRegistration.cs nơi tôi tin rằng vấn đề là.
Cập nhật 2: Một số liên kết có liên quan có liên quan đến những gì tôi cần phải làm gì và có thể giúp đỡ (Tôi đã trải qua tất cả nhưng vẫn không thể tìm ra cách để có được điều này làm việc với autofac):
CÁCH SỬ DỤNG Quartz.NET theo cách PRO? - http://blog.goyello.com/2009/09/21/how-to-use-quartz-net-in-pro-way/
Autofac và Quartz.NET - http://blog.humann.info/post/2013/01/30/Autofac-and-QuartzNET.aspx
Constructor tiêm với Quartz.NET và Injector Simple - Constructor injection with Quartz.NET and Simple Injector
ASP.Net MVC 3, Ninject và thạch anh .Net - Làm thế nào để? - ASP.Net MVC 3, Ninject and Quartz.Net - How to?
Đây là mã có liên quan:
Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var dependencyRegistration = new DependencyRegistration();
dependencyRegistration.Register();
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new ValidatorFactory()));
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
}
DependencyRegistration.cs
public class DependencyRegistration
{
public void Register()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
// Validation
builder.RegisterType<ValidatorFactory>()
.As<IValidatorFactory>()
.InstancePerHttpRequest();
AssemblyScanner findValidatorsInAssembly = AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly());
foreach (AssemblyScanner.AssemblyScanResult item in findValidatorsInAssembly)
{
builder.RegisterType(item.ValidatorType)
.As(item.InterfaceType)
.InstancePerHttpRequest();
}
// Schedule
builder.Register(x => new StdSchedulerFactory().GetScheduler()).As<IScheduler>();
// Schedule jobs
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(x => typeof(IJob).IsAssignableFrom(x));
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
//Schedule
IScheduler sched = container.Resolve<IScheduler>();
sched.JobFactory = new AutofacJobFactory(container);
sched.Start();
IJobDetail job = JobBuilder.Create<ReleaseJob>()
.WithIdentity("1Job")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("1JobTrigger")
.WithSimpleSchedule(x => x
.RepeatForever()
.WithIntervalInSeconds(5)
)
.StartNow()
.Build();
sched.ScheduleJob(job, trigger);
job = JobBuilder.Create<HelloJob>()
.WithIdentity("2Job")
.Build();
trigger = TriggerBuilder.Create()
.WithIdentity("2JobTrigger")
.WithSimpleSchedule(x => x
.RepeatForever()
.WithIntervalInSeconds(5)
)
.StartNow()
.Build();
sched.ScheduleJob(job, trigger);
}
}
JobFactory.cs
public class AutofacJobFactory : IJobFactory
{
private readonly IContainer _container;
public AutofacJobFactory(IContainer container)
{
_container = container;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)_container.Resolve(bundle.JobDetail.JobType);
}
public void ReturnJob(IJob job)
{
}
}
ReleaseJob.cs
public class ReleaseJob : IJob
{
private readonly IReleaseService _releaseService;
public ReleaseJob(IReleaseService releaseService)
{
this._releaseService = releaseService;
}
public void Execute(IJobExecutionContext context)
{
Debug.WriteLine("Release running at " + DateTime.Now.ToString());
}
}
public class HelloJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Debug.WriteLine("Hello job at " + DateTime.Now.ToString());
}
}
ReleaseServiceModel.cs
public class ReleaseServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ReleaseService>()
.As<IReleaseService>()
.InstancePerLifetimeScope();
}
}
Bạn đã tiết kiệm cho tôi thời gian tìm hiểu điều này. Cảm ơn rất nhiều Tomas. – slashp