【发布时间】:2011-02-07 17:54:10
【问题描述】:
有人建议我,当使用 IOC 容器时,我应该改变这个:
class Foobar: IFoobar, IDisposable {};
进入这个:
interface IFoobar: IDisposable{};
class Foobar : IFoobar{};
我想知道这是否可行,或者它是否解决了一个问题并产生了另一个问题。它确实解决了我非常想这样做的问题:
using( IFoobar = myContainer.Resolve<IFoobar>() )
{ ... }
现在我知道任何替代都不会导致运行时错误。
另一方面,现在我所有的模拟对象也必须处理 IDisposable。我对大多数任何模拟框架都可以轻松处理这个问题吗?如果是,那么也许这不是问题。
是吗?我应该注意另一个隐藏的问题吗?我肯定会想到,如果我使用 IOC 容器不是为了单元测试/模拟,而是为了真正的服务独立性,那么这可能是一个问题,因为也许我的可交换服务中只有一个实际处理非托管资源(现在我' m 必须在这些其他服务中实现空的“IDispose”操作)。
即使是后一个问题,我想我也可以忍受,以便获得使用上面演示的“使用”语句的能力。但我是在遵循一个流行的惯例,还是我错过了一个完全不同的更好的解决方案?
【问题讨论】:
-
谁推荐的?什么容器?
-
上面显示的技术是由与我一起工作的另一位工程师提出的。是的,我已经看过那个 stackoverflow 链接。事实上,它启发了我开始另一个线程:groups.google.com/group/structuremap-users/browse_thread/thread/… 简而言之,建议要么(1)不要将 IDisposable 对象与 Unity 一起使用,要么(2)不要使用 Unity。绕了一圈,这给了我总共 3 条建议。