gpt4 book ai didi

c# - Ninject 和异步操作

转载 作者:行者123 更新时间:2023-11-30 20:47:24 27 4
gpt4 key购买 nike

我现在一直在 Google 上四处搜寻,以找到有关如何将 Ninject 与异步/等待操作一起使用的任何有用示例。我自己也尝试了一些尝试,以找到任何模式,使它在无需编写大量代码的情况下真正起作用,但我还没有设法让它起作用。

拿基本问题最简单的描述就是 Entity Framework DbContext是在每个请求范围的基础上创建的(它是一个 ASP.NET MVC 应用程序),但是如果您尝试调用任何 *Async方法它将失败,并显示它已经在执行的信息(这很明显)。

所以,我需要的是调用Kernel.Get<MyContext>()创建独特的 DbContext使用 Ninject 的对象以及 Ninject 负责其生命周期的对象。使用 BeginBlock()或将范围更改为 InTransientScope()这不是一个真正的选择,因为第一个会使代码非常繁重,带有单独的 block 并处理这些 block ,而后者将调用者代码设置为负责处理 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 };

那么,有什么办法可以“简单”地解决这个问题吗?

最佳答案

这是您可以自己控制对象创建的方式:

public interface IContextFactory {
MyContext Create();
}

kernel.Bind<IContextFactory>().ToFactory // requires ninjext.extensions.factory

( Factory Extension Link )

用法:

using(var context1 = IContextFactory.Create())
using(var context2 = IContextFactory.Create())
{
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 };
} // context get's disposed here

注意:这需要上下文被绑定(bind).InRequestScope() ,否则,将为 .Create() 返回相同的对象电话。如果您有时需要它们 .InRequestScope()有时不是,您可以考虑使用 ninject contextual binding

关于c# - Ninject 和异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com