3

而不是使用这样的接口:

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

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

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

使用 start/stop 与使用 ctor/dispose 的优缺点是什么,尤其是在 IoC/DI 容器的上下文中?

编辑:很好的答案,你已经说服我使用可启动对象的界面。我无法决定谁的答案最好,所以我会在 24 小时后接受投票最多的人。

4

3 回答 3

6

使用界面的一般优势是它们是自我描述和自我广告的。如果没有接口,你就没有办法问一个对象,“你能不能启动和停止?” 相反,如果您确实使用接口,则可以查询对象以查看它们中的哪些将响应这些类型的消息。那么你就可以放心地保证这些对象已经实现了接口封装的功能。

于 2009-05-26T04:40:19.850 回答
4

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

仅此而已!

于 2009-05-26T04:40:37.073 回答
2

它可能取决于你说 Start() 时的具体含义。但总的来说,将对象初始化与例程执行(尤其是有状态和/或长时间运行的执行!)混合在一起违反了SoC

It also leaves a great deal of ambiguity. To a consumer, for a given object how do we know it is "starting" when we invoke the ctor? "For this given object, which implements no contract, I must leave it to hope in the author that it conforms to my expectations"? An interface makes the presence and availability of the action explicit.

于 2009-05-26T04:47:00.107 回答