当前位置:  开发笔记 > 运维 > 正文

温莎容器:如何强制处理物体?

如何解决《温莎容器:如何强制处理物体?》经验,为你挑选了1个好方法。

我有一个实现在Windsor容器中注册的IDisposable的对象,我想处理它,因此调用Dispose方法,下次调用Resolve时它会获取一个新实例.

是否

container.Release(obj); 

立即自动调用Dispose()?或者我需要做什么

obj.Dispose();
container.Release(obj);

在文档中找不到Release的确切内容

编辑: 请参阅下面的答案,了解我运行的测试结果.现在的问题是,如何强制容器释放具有单例生命周期的组件实例?这只需要在一个地方完成,编写自定义生命周期似乎太重量级了,有没有内置的方法呢?



1> Bittercoder..:

这是我认为人们在使用Windsor容器时并不是真正意识到的事情 - 特别是在容器的整个生命周期中,容器会保持一次性瞬态组件通常令人惊讶的行为,直到它被处理掉,除非你自己释放它们 - 尽管记录下来 - 看看这里 - 但要快速引用:

MicroKernel有一个可插拔的发布策略,可以连接并实现一些路由来处理组件.MicroKernel附带三个IReleasePolicy实现:

AllComponentsReleasePolicy:跟踪所有组件,以便在处理MicroKernel实例时强制执行正确的处理

LifecycledComponentsReleasePolicy:仅跟踪具有相关的解除授权生命周期的组件

NoTrackingReleasePolicy:不执行任何跟踪

您还可以使用IReleasePolicy接口实现自己的发布策略.

您可能更容易找到的是将策略更改为NoTrackingReleasePolicy,然后自行处理 - 这也存在潜在的风险,但如果您的生活方式很短暂(或者当您的容器被处理时,您的应用程序即将关闭)这可能不是什么大问题.但请记住,任何已经注入单身人士的组件都会有一个参考,所以你可能最终导致试图"刷新"你的单身人士的问题 - 这似乎是一个不好的做法,我想知道你是否可以避免首先通过改进应用程序的组合方式来做到这一点.

其他方法是使用它自己的decommission实现构建自定义生命周期(因此释放单例实际上会处理组件,就像瞬态生命周期一样).

另外一种方法是有一个装饰你的容器与一个单身生活方式的注册服务,但在盛有短暂的生活方式注册您的实际基础服务 - 那么当你需要刷新组件刚刚处置持有的瞬态基础组件的由装饰,并用新鲜解决实例来替换它(使用组件的关键,而不是服务,以避免使装饰解决它) - 持有这避免了与其他单身人士服务的问题(这是不被"刷新")处理陈旧的服务,使其无法使用,但需要一些铸造等使其工作.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有