如何为每个 WF 实例提供一个 Unity DbContext

本文关键字:一个 DbContext Unity WF 实例 | 更新日期: 2023-09-27 18:35:34

目标:每个工作流实例都有一个 DbContext 实例,用于隔离更改以防止并发失败并允许事务。

环境:我在 N 层(服务、存储库、EF5)应用程序中使用 Unity,并在网站和 WF 中重复使用所有相同的接口/类(Unity.WF,使用自定义工厂添加 Unity RegisterTypes)。我让网站的 EF 对象在 PerRequestLifetimeManager 下运行,效果很好,我正在尝试为我的 WF 实例做同样的事情。

我有一台运行 WF 服务的服务器(带有 WCF 端点的 WF 4.5),很快这将需要两台(如果这对任何人的答案有任何影响)。我有多个 WF 定义(xamlx 工作流),特别是一个很快就会每天调用 1000 次来处理客户端上传的文件。处理时间可以在 <1 分钟到 1 小时之间,具体取决于上传的数据量,因为已将其设置为允许传入请求立即保留,然后在服务器空闲时恢复。

问题:记录的 Lifetime Manager for EF with Unity.WF 是 HierarchicalLifetimeManager,但这似乎在相同 WF 定义的所有正在运行的 WF 实例中使用相同的 EF 实例。

我已经尝试了几个WCF Unity 生存期管理器,但它们都依赖于OperationContext.Current,它仅在WF不持久时才可用,这不适用于我的情况。

所以我尝试了Microsoft WF安全包,它声称能够通过活动创建/复活操作上下文,这也不起作用。

这肯定是其他人面临的常见问题吗?

我的下一步是创建我自己的 LifetimeManager,并以某种方式了解工作流实例 ID 并从字典返回正确的 EF 对象,但是当代码尝试解析存储库构造函数中 2 级深处的依赖项时,我将如何获得该 id?

谢谢

如何为每个 WF 实例提供一个 Unity DbContext

更新:首先,我可以使用 NativeActivity 容器,并在属性中设置 DataContext,如 http://blogs.msdn.com/b/tilovell/archive/2009/12/20/workflow-scopes-and-execution-properties.aspx。这确实为我的子活动提供了使用相同的数据上下文。

的问题没有消失,它总是在同一个活动中失败,我怀疑这是因为延迟加载。因此,我最终在 Execute 函数中使用了一个锁来确保只有 1 个 WF 可以同时运行此活动,并检查一个易失性静态布尔值,以便其他 WF 可以延迟并且不会阻止 maxConcurrentInstances。

我希望这对其他人有所帮助。

相关文章: