Does using the Threadpool in .net break the (loosely speaking) rules if using an IOC container?
我喜欢控制反转(IOC)模式,并经常使用它。像往常一样,我对线程和它们在.NET的OO生态圈中的位置有问题。
我在考虑线程化并使用.NET中的"内置"threadpool类,我意识到它的操作与您的代码在一个完全不同的级别上,并且它超出了IOC模式对于IOC容器(如Unity)的范围。
我不太清楚在国际奥委会的领域里有什么样的线索,但是如果可以被当作一个类来对待,那么它可能是一个被纳入你的国际奥委会框架的候选人。如果是这种情况,您如何处理线程池的使用。
这个评估是正确的吗?
首先,我实际上从未直接使用ThreadPool,而是有一个接口IThreadPoolService,我通过一个ioc容器解析它。这对于单元测试逻辑非常有帮助,在单元测试逻辑中,线程方面会使事情变得更困难,但不会给测试方面增加任何内容。我可以使用非线程测试版本模拟服务。
我不认为使用ThreadPool违反了IOC,因为ThreadPool本身并不控制任务,它只负责调用入口点。它也不是"创造性的",它是IOC容器的核心部分。
使用ioc容器解析IThreadPoolService提供了添加间接层的通常好处,例如,您可以更改实现并添加其他行为,例如日志记录,当然可以通过iocdi支持这些行为。
- 我喜欢使用threadpool接口的风格。然后,您将如何通过接口指向容器中的threadpool,或者滚动您自己的threadpool?
- @Weneedan为真正的线程池提供了一个代理类型的模式,其中我有一个实现IThreadPoolService并将调用转发到真正的ThreadPool的类,这是一个简单的包装器。当在应用程序启动时引导容器时,我注册了这个,然后解析接口的所有请求都将获得ThreadPool代理类。对于测试场景,我可以提供IThreadPoolService的虚拟实现,它实际上不使用线程,而是直接调用传入的委托。
- 听起来不错,我也这么想。
- @chibacity不确定我是否同意这样一个事实:测试线程本身没有值;很难测试是,但它仍然有值。线程错误是很难追踪的。
- @我并不是故意说测试多线程代码没有价值。这根本不是我想表达的。有时,您需要测试与线程方面正交的逻辑,例如使用异步代码。在这些情况下,挂起线程方面很有帮助,这样您可以更容易地测试行为。我测试多线程代码——我听到你的声音清晰。
- @奇巴西蒂明白了…误解…
线程和IOC没有太多共同点。无论是否涉及穿线,都可能发生松耦合。尝试为线程类提供接口是可能的,但是您不抽象掉其他.NET框架类,是吗?
采用将以某种形式公开数据的服务。如果服务决定通过线程提供异步行为,那么使用者必须考虑到这一点。打电话给国际奥委会仍然是国际奥委会的职责范围。
当服务作为接口公开时,它可以根据需要进行更改,同时仍然提供所需的行为,在这种情况下,这将是异步行为。这将允许您在接口中定义一个方法,并在数据准备就绪后定义一个回调/事件,同时仍然使用Unity和其他IOC框架。
- 我同意线程类和IOC没有任何共同点,但是线程池和一个实现了自己的线程池模型的IOC可能会有利益冲突。
- @我们不需要回答,不确定我是这么看的。线程池只是框架的一部分。这又回到了询问您如何对待框架的其他部分?你有登记簿吗?当然不是。提供一种利用threadpool的服务是可以理解的,但是threadpool如何以任何方式比任何其他结构更紧密地与IOC概念联系在一起并不一定意味着要改变IMHO。
- 内置的配置类和所有其他的静态类型类也会很好,比如文件等。imho我认为这将是一个糟糕的代码,而且会有点异味。我也这么认为,使用threadpool并不明确,这意味着你不能用更好/平等的东西来代替它,这是国际奥委会的另一个主张。