我在控制台应用程序中使用InSingletonScope()
数据库上下文有什么问题吗?我正在循环运行并为每个项目运行作业。另一个范围会更好吗?如果我在Web应用程序中使用Ninject,我通常会使用RequestScope。
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>()
.InSingletonScope();
答案 0 :(得分:3)
这取决于您的控制台应用是否是多线程的。如果是这样,您应该使用InThreadScope
,这样IDisposable
对象将被放置在线程的末尾。如果没有,您可以继续InSingletonScope
在单线程应用中使用InThreadScope
没有任何区别。
如果您对范围界定有一些额外需求,可以尝试custom scope InScope
。或者你可以尝试ninject named scope extensions。
答案 1 :(得分:0)
这都是关于'请求'的。每个应用程序处理请求,每个请求都应该有自己的范围。如果你的控制台应用程序只处理一个请求(它处理命令行参数,执行一些业务逻辑和死亡),单例范围就可以了。如果您的应用程序存在很长时间并处理许多请求(因为可能建议使用作业),那么最好将每个作业(或可选的一组作业)视为一个请求。
在Web应用程序中,请求通常是Web请求,范围通常是一个HTTP请求。对于WCF服务,请求是一个WCF操作,范围围绕该操作。对于Windows服务,不存在HTTP或WCF操作,并且通常使用称为“生命周期范围”的东西(显式开始和结束的生命周期)。
我不知道Ninject的确切术语是什么,但你可能需要像终身范围这样的东西。