如何为 ASP.NET MVC 和 Quartz 使用的对象管理 Ninject 范围绑定?
How to manage Ninject scope binding for objects used by both ASP.NET MVC and Quartz?
我有一个 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>();
太棒了!那应该有用....
不,因为注入 GenericRepository
的 AppContext
仍将在 RequestScope
中,所以我也需要 AppContext
的条件绑定。但是怎么办??我不能做 WhenInjectedInto
因为 AppContext
总是会被注入 GenericRepository
.
有什么想法吗?或者,如果有更好的方法在 MVC 应用程序中管理 Quartz 作业范围,请分享 :)
Ninject 提供了一个通用的 InScope()
方法,您可以使用它来 return 您自己定义范围的自定义对象。我过去曾使用它来首先尝试解析请求范围,如果没有,则 return 当前线程作为范围。这样你就有了一种 "Hybrid" 范围。
我有一个 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>();
太棒了!那应该有用....
不,因为注入 GenericRepository
的 AppContext
仍将在 RequestScope
中,所以我也需要 AppContext
的条件绑定。但是怎么办??我不能做 WhenInjectedInto
因为 AppContext
总是会被注入 GenericRepository
.
有什么想法吗?或者,如果有更好的方法在 MVC 应用程序中管理 Quartz 作业范围,请分享 :)
Ninject 提供了一个通用的 InScope()
方法,您可以使用它来 return 您自己定义范围的自定义对象。我过去曾使用它来首先尝试解析请求范围,如果没有,则 return 当前线程作为范围。这样你就有了一种 "Hybrid" 范围。