ASP.Net MVC 3, Ninject и Quartz.Net - Как? - PullRequest
13 голосов
/ 19 июля 2011

Я сейчас использую Ninject 2.2.1.4 с моим MVC3, я успешно настрою запуск Ninject с ним, но я не знаю, как заставить Ninject работать с Quartz.Net в моем MVC3 Кто-нибудь может помочь?

1 Ответ

20 голосов
/ 19 июля 2011

Создайте JobFactory, который использует Ninject

public class NinjectJobFactory : IJobFactory
{
    private readonly Func<Type, IJob> jobFactory;

    public NinjectJobFactory (Func<Type, IJob> jobFactory)
    {
        this.jobFactory = jobFactory;
    }

    public IJob NewJob(TriggerFiredBundle bundle)
    {
        return this.jobFactory(bundle.JobDetail.JobType);
    }
}

и QuarzSchedulerProvider

public class QuartzSchedulerProvider : Provider<IScheduler> 
{
    private readonly IJobFactory jobFactory;
    private readonly IEnumerable<ISchedulerListener> listeners;
    private readonly ISchedulerFactory schedulerFactory;

    public QuartzSchedulerProvider(
        ISchedulerFactory schedulerFactory,
        IJobFactory jobFactory, 
        IEnumerable<ISchedulerListener> listeners)
    {
        this.jobFactory = jobFactory;
        this.listeners = listeners;
        this.schedulerFactory = schedulerFactory;
    }

    protected override IScheduler CreateInstance(IContext context)
    {
        var scheduler = this.schedulerFactory.GetScheduler();
        scheduler.JobFactory = this.jobFactory;
        foreach (var listener in this.listeners)
        {
            scheduler.AddSchedulerListener(listener);
        }

        return scheduler;
    }
}

и SchedulerFactoryProvider

public class QuartzSchedulerFactoryProvider : Provider<ISchedulerFactory>
{
    protected override ISchedulerFactory CreateInstance(IContext context)
    {
        var properties = new NameValueCollection();
        properties["quartz.dataSource.DataSource.connectionString"] = "Your connection string";
        properties["quartz.dataSource.DataSource.provider"] = "Your provider";

        properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
        properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz ";
        properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
        properties["quartz.jobStore.dataSource"] = "DataSource";
        properties["quartz.jobStore.useProperties"] = "true";

        return new StdSchedulerFactory(properties);
    }
}

и настройте

Bind<IJobFactory>().To<NinjectJobFactory>();
Bind<ISchedulerFactory>().ToProvider<QuartzSchedulerFactoryProvider>();
Bind<IScheduler>().ToProvider<QuartzSchedulerProvider>().InSingletonScope();
Bind<Func<Type, IJob>>().ToMethod(ctx => t => (IJob)ctx.Kernel.Get(t));

Если вам нужен ISchedulerListener, например, для ведения журналов, привязайте их и здесь.

Добавьте экземпляр IScheduler, в который вы хотите добавить Jobs, и, скорее всего, вам придется делать инъекцию свойств экземпляра в global.asax тоже,Но обратите внимание, я еще не использовал Quarz в контексте MVC, так как я думаю, что запланированные задачи не относятся к веб-приложению, а скорее относятся к службе, работающей на том же сервере.

...