gpt4 book ai didi

ioc-container - IOC 容器和 IDisposable

转载 作者:行者123 更新时间:2023-12-04 03:46:49 27 4
gpt4 key购买 nike

有人建议我,在使用 IOC 容器时,我应该改变这个:

class Foobar: IFoobar, IDisposable {};

进入这个:
interface IFoobar: IDisposable{};
class Foobar : IFoobar{};

我想知道这是否可以,或者它是否解决了一个问题并创建了另一个问题。它确实解决了我非常想这样做的问题:
using( IFoobar = myContainer.Resolve<IFoobar>() )
{ ... }

现在我知道任何替代品都不会导致运行时错误。

另一方面,现在我所有的模拟对象也必须处理 IDisposable。我对大多数任何模拟框架都可以轻松处理这个问题吗?如果是,那么也许这不是问题。

或者是吗?我应该注意另一个隐藏的问题吗?我肯定会想到,如果我使用 IOC 容器不是为了单元测试/模拟,而是为了真正的服务独立性,那么这可能是一个问题,因为也许我的可交换服务中只有一个实际处理非托管资源(现在我' m 必须在这些其他服务中实现空的“IDispose”操作)。

即使是后一个问题,我想我也可以忍受,以便获得使用上面演示的“使用”语句的能力。但是我是在遵循一个流行的惯例,还是我错过了一个完全不同的更好的解决方案?

最佳答案

在我看来,从 IDisposable 派生接口(interface)是一种设计味道,表明 泄漏抽象 .作为尼古拉斯·布鲁姆哈特 put it :

an interface [...] generally shouldn't be disposable. There's no way for the one defining an interface to foresee all possible implementations of it - you can always come up with a disposable implementation of practically any interface.



考虑一下为什么要将 IDisposable 添加到界面中。可能是因为你有 考虑到特定的实现 .因此,实现泄漏到抽象中。

一个称职的 DI 容器应该知道它何时创建了一次性类型的实例。当您随后要求容器释放对象图时,它应该 自动处理一次性组件(如果他们的时间根据他们的生活方式而定)。

我知道至少 CaSTLe Windsor 和 Autofac 是这样做的。

所以在你的情况下,你应该保持你的类型是这样的:
class Foobar: IFoobar, IDisposable {};

您可以找到 Nicholas Blumhardt 的帖子 The Relationship Zoo也很有趣——尤其是关于 Owned<T> 的讨论.

关于ioc-container - IOC 容器和 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2634675/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com