【发布时间】:2014-09-18 15:22:04
【问题描述】:
我现在已经在 Google 上搜寻了一下,以找到有关如何将 Ninject 与异步/等待操作一起使用的任何有用示例。我自己也尝试了一点,以找到任何可以使其实际工作而无需编写大量代码的模式,但我还没有设法使其工作。
对基本问题采取最简单的描述是实体框架DbContext是在每个请求范围的基础上创建的(它是一个 ASP.NET MVC 应用程序),但是如果您尝试调用任何*Async 方法它将失败并显示它已经在执行的信息(这很明显)。
所以,我需要的是调用 Kernel.Get<MyContext>() 使用 Ninject 创建唯一的 DbContext 对象,并且 Ninject 负责其生命周期。使用BeginBlock() 或将范围更改为InTransientScope() 并不是一个真正的选择,因为第一个选项会使代码非常繁重,带有单独的块并处理这些块,而后一组是负责处理DbContext 的调用者代码。
我想做的代码的POC示例:
var context1 = NinjectKernelReference.Get<MyContext>(); //I want this to be a unique reference
var context2 = NinjectKernelReference.Get<MyContext>(); //I want this to be a unique reference
var task1 = context1.Customers.Where(c => c.ZipCode == "4444")
.Select(c => new {
c.Name,
c.PhoneNumber
})
.Take(50)
.ToArrayAsync();
var task2 = context2.Customers.CountAsync(c => c.ZipCode == "4444");
Task.WaitAll(task1, task2);
return new Result { task1.Result, task2.Result };
那么,有什么方法可以“简单”地解决这个问题?
【问题讨论】:
-
我认为这是有问题的,因为您可能会将对象从一个上下文泄漏到另一个上下文中。将更新哪个上下文?等等。如果您想这样做,我建议您通过工厂创建上下文并手动管理生命周期(
using块,一旦您不再需要它就会处理它)。这至少可以清楚地说明它是如何工作的。 -
从我的代码中可以看出,它只打算与 Select 语句一起使用,因此在这些情况下不会更新上下文。但是“通过工厂创建上下文”是什么意思?你有这方面的例子吗?
标签: c# asp.net asp.net-mvc asynchronous ninject