如何为每个WF实例安装一个Unity DbContext?

时间:2014-12-28 22:16:24

标签: c# wcf entity-framework-5 unity-container workflow-foundation-4

目标:为每个Workflow实例提供一个DbContext实例,用于隔离更改以防止并发失败并允许事务。

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

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

问题: 带有Unity.WF的文档LifetimeManager for EF是HierarchicalLifetimeManager,但是这似乎在相同WF定义的所有正在运行的WF实例中使用相同的EF实例。

我已经尝试了几个WCF Unity Lifetime Manager,但它们都依赖于OperationContext.Current,只有在WF不存在时才可用,这对我的情况不起作用。

所以我尝试了微软WF安全包,声称能够使用活动创建/恢复OperationContext,这也不起作用。

当然这是其他人面临的常见问题?

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

由于

1 个答案:

答案 0 :(得分:0)

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

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

我希望这有助于其他人。