我们有一个使用我们提供商提供的SDK的应用程序,可以轻松地与他们集成。该SDK连接到AMQP端点,并简单地将消息分发,缓存和转换给我们的使用者。以前,这种集成是通过HTTP进行的,使用XML作为数据源,并且旧的集成具有两种缓存DataContext的方式-每个Web请求和每个托管线程ID。 (1)
但是,我们现在不通过HTTP进行集成,而是通过AMQP集成,这对我们来说是透明的,因为SDK可以完成所有连接逻辑,而且我们只剩下定义我们的使用者,因此没有选择可以按Web请求缓存DataContext ”,因此仅保留每个托管线程ID。我实现了责任链模式,因此当有更新时,将其放在处理程序的一个管道中,该处理程序使用DataContext根据新的更新来更新数据库。这就是管道的调用方法的样子:
public Task Invoke(TInput entity)
{
object currentInputArgument = entity;
for (var i = 0; i < _pipeline.Count; ++i)
{
var action = _pipeline[i];
if (action.Method.ReturnType.IsSubclassOf(typeof(Task)))
{
if (action.Method.ReturnType.IsConstructedGenericType)
{
dynamic tmp = action.DynamicInvoke(currentInputArgument);
currentInputArgument = tmp.GetAwaiter().GetResult();
}
else
{
(action.DynamicInvoke(currentInputArgument) as Task).GetAwaiter().GetResult();
}
}
else
{
currentInputArgument = action.DynamicInvoke(currentInputArgument);
}
}
return Task.CompletedTask;
}
问题是(至少我认为是这样),责任链是返回/启动新任务的方法链,所以当实体A的更新到来时,它由托管线程id = 1处理那么只有在同一实体A再次到达后,才由托管线程id = 2处理,例如。这导致:
System.InvalidOperationException:'IEntityChangeTracker的多个实例不能引用一个实体对象。'>
因为托管线程ID = 1中的DataContext已经跟踪了实体A。(至少我认为是这样)
我的问题是如何在我的情况下缓存DataContext?你们有同样的问题吗?我阅读了this和this答案,从我的理解,使用一个静态DataContext也不是一种选择。(2)
社区问的问题:
我们有一个使用我们提供商提供的SDK的应用程序,可以轻松地与他们集成。该SDK连接到AMQP端点,并简单地将消息分发,缓存和转换给我们的使用者。 ...
我不知道您正在处理的实际情况。但据我所知每个工作单元只能播放一个DbContext