C# MVC4和x2B;Ninject+;石英-执行以下操作的正确方法是什么:
在我的解决方案中,我在主web项目中使用EF和repository模式以及Ninject来解决控制器依赖关系,我还有一个管理Quartz作业的作业项目-什么是将Ninject与Quartz链接以使EF工作的正确方法 我知道我需要实现自定义JobFactory,因此我在我的作业项目中创建了以下内容:C# MVC4和x2B;Ninject+;石英-执行以下操作的正确方法是什么:,c#,entity-framework,asp.net-mvc-4,ninject,quartz.net,C#,Entity Framework,Asp.net Mvc 4,Ninject,Quartz.net,在我的解决方案中,我在主web项目中使用EF和repository模式以及Ninject来解决控制器依赖关系,我还有一个管理Quartz作业的作业项目-什么是将Ninject与Quartz链接以使EF工作的正确方法 我知道我需要实现自定义JobFactory,因此我在我的作业项目中创建了以下内容: public class NinjectJobFactory : IJobFactory { private readonly IKernel resolutionRoot; pub
public class NinjectJobFactory : IJobFactory
{
private readonly IKernel resolutionRoot;
public NinjectJobFactory(IKernel resolutionRoot)
{
this.resolutionRoot = resolutionRoot;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)this.resolutionRoot.Get(bundle.JobDetail.JobType);
}
public void ReturnJob(IJob job)
{
string dud = "";
}
}
为了初始化quartz作业,我执行以下操作:
public void Start()
{
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler();
sf.GetScheduler().JobFactory = new NinjectJobFactory(ninjectKernel);
DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTime.UtcNow);
DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 10);
IJobDetail job = JobBuilder.Create<CheckIfAllSaleActionDataIsValid>()
.WithIdentity("CheckIfAllSaleActionDataIsValid", "HostessStatJobs")
.Build();
job.JobDataMap.Add("SiteUrl", SiteUrl);
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("CheckIfAllSaleActionDataIsValidTrigger", "HostessStatJobTriggers")
.StartAt(startTime)
.WithCronSchedule("0 0 0/1 1/1 * ? *")
.Build();
sched.ScheduleJob(job, trigger);
IJobDetail job2 = JobBuilder.Create<CheckPaymentAndAssigneRoles>()
.WithIdentity("CheckPaymentAndAssigneRoles", "HostessStatJobs")
.Build();
job2.JobDataMap.Add("commonMethods", ninjectKernel.Get<CommonMethods>());
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("CheckPaymentAndAssigneRolesTrigger", "HostessStatJobTriggers")
.StartAt(startTime)
.WithCronSchedule("0 0/1 * 1/1 * ? *")
.Build();
sched.ScheduleJob(job2, trigger2);
sched.Start();
}
public void Start()
{
isSchedulerFactory sf=新StdSchedulerFactory();
isScheduler sched=sf.GetScheduler();
sf.GetScheduler().JobFactory=新的NinjectJobFactory(ninjectKernel);
DateTimeOffset运行时=DateBuilder.EvenMinuteDate(DateTime.UtcNow);
DateTimeOffset startTime=DateBuilder.NextGivenSecondDate(null,10);
IJobDetail job=JobBuilder.Create()
.WithIdentity(“CheckIfAllSaleActionDataIsValid”,“HostessStatJobs”)
.Build();
job.JobDataMap.Add(“SiteUrl”,SiteUrl);
ITrigger trigger=TriggerBuilder.Create()
.WithIdentity(“CheckIfAllSaleActionDataIsValidTrigger”、“HostessStatJobTrigger”)
.StartAt(startTime)
.WithCronSchedule(“0 0/1 1/1*?*”)
.Build();
sched.ScheduleJob(作业,触发器);
IJobDetail job2=JobBuilder.Create()
.带有标识(“支票付款和分配角色”、“女主人工作”)
.Build();
job2.JobDataMap.Add(“commonMethods”,ninjectKernel.Get());
ITrigger trigger2=TriggerBuilder.Create()
.带有标识(“支票付款和分配角色触发器”、“HostessStatJobTriggers”)
.StartAt(startTime)
.WithCronSchedule(“0 0/1*1/1*?*”)
.Build();
调度作业(作业2,触发器2);
sched.Start();
}
我说得对吗?如果不是-每次运行作业时注入不同DbContext的正确方法是什么?InRequestScope在MVC项目之外不起作用…作业应该使用哪个
DbContext
实例?由于quartz会在稍后时间安排作业,因此在该时间点没有“有效”请求。所以我猜绑定DbContext
.InRequestScope()
不能正常工作。您需要一些其他方法来控制计划作业的DbContext
的生命周期。@BatteryBackupUnit:很抱歉我的回复太晚-请参阅我的编辑。