У меня есть приложение ASP.NET MVC, которое запускает несколько запланированных заданий с Quartz.Как управлять привязкой области Ninject для объектов, используемых как ASP.NET MVC, так и Quartz?
В проекте используется структура Entity Framework с шаблоном репозитория. И в моем проекте MVC, связывание для AppContext
и GenericRepository
являются InRequestScope
:
Bind<AppContext>().ToSelf().InRequestScope();
Bind<IGenericRepository>().To<GenericRepository>().InRequestScope();
GenericRepository
принимает AppContext
в качестве аргумента конструктора, и обзорное здесь имеет смысл для проекта MVC. Однако контекст и репозиторий также используются некоторыми заданиями Quartz, и, очевидно, вышеуказанная область не будет работать для задания Quartz. Например:
public class SampleJob : IJob
{
public SampleJob(IGenericRepository repository)
{
// some code...
}
}
Здесь мне нужно вводить IGenericRepository
с другой области, возможно, InThreadScope()
. И я могу сделать это с помощью условного связывания IGenericRepository
следующим образом:
Bind<IGenericRepository>()
.To<GenericRepository>()
.InThreadScope()
.WhenInjectedInto<SampleJob>();
Отлично! Это должно работать ....
Нет, потому что AppContext
, который вводится в GenericRepository
еще будет в RequestScope
, так что мне нужно условное связывание для AppContext
тоже. Но как?? Я не могу сделать WhenInjectedInto
, потому что AppContext
всегда будет вводиться в GenericRepository
.
Любая идея? Или, если есть лучший способ управлять областями работы Quartz в приложении MVC, пожалуйста, делите :)
Предоставьте «IGenericRepositoryFactory» стороне кварца и управляйте жизненным циклом хранилища как локальной переменной с помощью операторов 'using'. – spender
им жаль, но не могли бы вы подробнее рассказать об этом подходе? благодаря! –