2

InSingletonScope()我在控制台应用程序中使用数据库上下文有什么问题吗?我正在运行一个循环并为每个项目运行一个作业。另一个范围会更好吗?如果我在 Web 应用程序中使用 Ninject,我通常使用 RequestScope。

static void Main(string[] args)
{
    IKernel kernel = new StandardKernel();

    kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>()
        .InSingletonScope();
4

2 回答 2

3

这取决于您的控制台应用程序是否是多线程的。如果是这样,你应该使用InThreadScope这样的IDisposable对象将在线程的末尾被释放。如果没有,您可以继续使用InSingletonScope它,这与您InThreadScope在单线程应用程序中使用没有什么区别。

如果您对范围有一些额外的要求,您可以尝试自定义范围 InScope。或者您可以尝试ninject 命名范围扩展

这里有类似的问题:为控制台应用程序配置 Ninject 并为我的 MVC 应用程序利用现有存储库

于 2013-08-20T08:05:24.390 回答
0

这都是关于“请求”的。每个应用程序都处理请求,每个请求都应该有自己的范围。如果您的控制台应用程序只处理一个请求(它处理命令行参数,执行一些业务逻辑并死掉),那么单例范围就可以了。如果您的应用程序存在很长时间并处理许多请求(正如使用作业可能暗示的那样),最好将每个作业(或可选的一组作业)视为一个请求。

在 Web 应用程序中,请求通常是 Web 请求,并且范围通常围绕一个 HTTP 请求。对于 WCF 服务,请求是一个 WCF 操作,范围围绕该操作。对于 Windows 服务,没有 HTTP 或 WCF 操作之类的东西,您通常使用称为“生命周期范围”的东西(您明确开始和结束的生命周期)。

我不知道 Ninject 的确切术语是什么,但你可能需要像生命周期这样的东西。

于 2013-08-20T10:30:11.240 回答