工作单元并不一定意味着上下文是隐式的(或范围,就此而言)。我相信明确的 UoW 是很正常的(例如,您的 BO 类型会保留对其“拥有”上下文的引用,这本身就是线程安全的)。也就是说,隐式上下文是可能的async
。
当您await
仅在 ASP.NET 请求上下文中使用时,最好的选择是使用HttpContext.Items
. 或者,您可以使用线程安全的静态成员。
当您await
仅在 UI 上下文中使用时,您可以使用常规静态成员。
当您使用多线程时,您可以使用线程局部变量。
但是,如果您的任何代码使用多线程( await
例如,ConfigureAwait(false)
或将async
lambda 传递给Task.Run
),那么这些选项都不起作用。
AFAIK,只有一个通用的解决方案,我在我的博客上描述:CallContext.LogicalGetData
和CallContext.LogicalSetData
。逻辑调用上下文将跨线程流动,并且可以在任何async
情况下工作。
这种方法有一些限制:
- 您必须使用 .NET 4.5 框架。
CallContext
是async
在 .NET 4.5 中实现的,因此如果您的目标是 .NET 4.0 / Phone / Silverlight,这将无法正常工作。
- 您应该只存储不可变数据。如果您使用Microsoft.Bcl.Immutable,这会变得容易得多。