使用像IStartable这样的概念有什么好处?

时间:2009-05-26 04:32:39

标签: oop dependency-injection inversion-of-control object-lifetime

而不是使用这样的界面:

public interface IStartable
{
    void Start();
    void Stop();
}

我通常只是使对象的构造函数运行Start()代码,并实现IDisposable,以便dispose方法运行Stop()代码。

这只是风格问题吗?或者我没有像IStartable这样的东西错过了一些重要的东西?我所看到的只是额外的复杂性,因为你必须维持它的启动/停止状态。

使用启动/停止与使用ctor / dispose的优缺点是什么,特别是在IoC / DI容器的上下文中?

编辑:很棒的答案,你说服我使用一个可启动对象的界面。我不能确定谁的答案是最好的,所以我会接受24小时后得票最多的人。

3 个答案:

答案 0 :(得分:6)

使用界面的一般优势是它们是自我描述和自我广告。如果没有接口,则无法询问对象,“您可以启动并停止吗?”相反,如果使用界面,则可以查询对象以查看哪些对象将响应这些类型的消息。然后,您可以安全地保证这些对象已实现接口封装的功能。

答案 1 :(得分:4)

一般来说,构造函数应该生成一个正确初始化的对象

,仅此而已!

答案 2 :(得分:2)

当你说Start()时,它可能取决于你的意思。但一般来说,将对象初始化与例程执行混合(特别是有状态和/或长时间执行!)会违反SoC

这也留下了很多含糊之处。对于消费者而言,对于给定的对象,当我们调用ctor时,我们如何知道它是“开始”的? “对于这个没有签订合同的特定对象,我必须让作者希望它符合我的期望”?界面使动作的存在和可用性显式化。