我有一个ASP.NET MVC应用程序,它使用Quartz运行几个计划作业。如何管理ASP.NET MVC和Quartz使用的对象的Ninject作用域绑定?
该项目使用实体框架与存储库模式。而在我的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>();
太好了!这应该工作....
不,因为被注入GenericRepository
的AppContext
仍然会在RequestScope
,所以我需要AppContext
条件结合得。但是怎么样?我不能这样做WhenInjectedInto
,因为AppContext
将始终注入GenericRepository
。
有什么想法?或者如果有更好的方式来管理MVC应用程序中的Quartz作业范围,请分享:)
向Quartz提供'IGenericRepositoryFactory',并使用'using'语句将存储库的寿命作为局部变量进行管理。 – spender
即时对不起,但你能详细说明这种方法吗?谢谢! –