|
64
|
| Rory MacLeod · 技术社区 · 16 年前 |
|
|
1
38
我确信有很多方法代码可以调用SynchronizedLifetimeManager,或者像ContainerControlledLifetimeManager这样的子代,但是有两种特别的场景给我带来了问题。 第一个是我自己的错误-我使用构造函数注入来提供对容器的引用,在该构造函数中,我还将类的新实例添加到容器中以供将来使用。这种向后的方法的效果是将生存期管理器从Transient更改为ContainerControlled,从而使名为GetValue on的对象统一性与名为SetValue on的对象不同。吸取的教训是 第二种情况是,每次调用RegisterInstance时,UnityDefaultBehaviorExtension都会调用SetValue,而不首先调用GetValue。幸运的是,团结是可以扩展的,只要有足够的血性思维,你就可以解决这个问题。 从以下新的行为扩展开始:
然后需要一种方法来替换默认行为。Unity没有删除特定扩展的方法,因此您必须删除所有内容,然后重新放入其他扩展:
现在,您可以安全地使用RegisterInstance,而不用担心被推向疯狂的边缘。当然,这里有一些测试:
|
|
|
2
12
Fixed 在Unity的最新版本(2.1.505.2)中。通过NuGet获取。 |
|
3
10
很遗憾,您的问题的答案是否定的。我在Microsoft patterns&实践小组(直到最近我还是那里的开发负责人),我们把它作为一个bug考虑到entlib5.0中。我们做了一些调查,得出的结论是,这是由我们的代码和调试器之间的一些意外交互造成的。我们确实考虑过修复,但结果证明这比现有代码更复杂。最后,这被排在了其他事情之后,并没有成为5的标准。
|
|
|
4
7
我使用这个简短的解决方案:
像这样使用:
当做, 科恩 |
|
|
5
4
罗里的解决方案很好-谢谢。解决了每天困扰我的问题! 我对Rory的解决方案做了一些小的调整,这样它就可以处理注册的任何扩展(在我的例子中,我有一个wpfprism/复合扩展)。。
|
|
|
6
1
注意祖宾阿波的回答中的一个错误:有 UnityClearBuildPlanStrategies公司 正确的代码段是:
|
|
|
7
0
Unity 2.1 - August 2012 update fix the bug
|
|
|
8
-8
这可能会帮助您:
|