EBa*_*arr 5 c# dependency-injection simple-injector asp.net-web-api
这真的是对这个问题的跟进.其中一个Simple Injector开发人员指出了一个关于Simple Injector的有用信息,我认为让它更易于访问是件好事.
那么,使用Web API 1和.NET 4.0支持Simple Injector是否有任何技术障碍?源代码很容易下载和编译.它似乎工作得很好.
我们故意选择不支持.NET 4.0 for Web API,因为WebApiRequestLifestyle它使用了CallContext.LogicalGetData,它在.NET 4.0下表现不同.此行为是如此显着不同,以至于ExecutionContextScope在后台线程中使用嵌套实例并且Tasks并行运行时可能会导致错误.
在这方面发生了哪些变化,在.NET 4.5中,逻辑调用上下文显示了写时复制行为,这意味着当逻辑调用上下文从并行操作中更改时,它对生成的原始操作没有影响这种并行操作.在.NET 4.0中,可以从主操作中观察到并行操作中对逻辑调用上下文的任何更改.
我们决定依赖于.NET 4.5的这种写时复制行为,因为它允许从主操作生成多个并行操作,这些操作都可以启动自己的ExecutionContextScope(这是Web API集成包在背景)孤立地运行.这允许它们拥有自己的子范围,并且当范围被处理时,它们在主操作的范围内再次运行.从后台线程中的新范围开始通常是您想要做的事情,因为否则您的组件将被并行访问,而它们可能根本不是线程安全的.启动新范围可确保在从容器中解析新对象图时,如果将新实例注册为"按Web API请求"或"按执行范围",则会创建新实例.
如果没有这种写入操作行为,并行操作会相互干扰,并且会看到其他并行操作的范围,这会导致这些范围嵌套,而实际上它们不会嵌套,而是重叠.这将导致各种问题,例如导致退回到另一个并行操作的范围(而不是回到主操作的范围).这当然是不正确的行为.
只要您只ExecutionContextScope在异步流中启动新的(或者根本不启动新的作用域)而不是在并行操作中启动新作用域,问题就不存在了,并且您的代码将在.NET 4.0和.NET 4.0下运行.NET 4.5.
但是,由于这种行为是如此根本不同并且可能导致各种问题,或者当它似乎工作时,当你切换到.NET 4.5时可能会再次破坏,我们认为不尝试支持.NET是明智的. 4.0根本没有.这可以防止开发人员陷入这个陷阱,它使我们自己的工作变得更加容易,因为我们不必记录这个根本的区别,它也节省了我们很多支持时间,因为无论文档有多好,开发人员无论如何都会尝试在.NET 4.0下使用它,这可能会触发Stackoverflow和Simple Injector论坛上的许多新问题,我们将不得不回答这个问题.
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |