C# 如果使用IOC容器,在.net中使用线程池是否违反了(粗略地说)规则?
我喜欢控制反转(IOC)模式,并经常使用它。像往常一样,我对线程以及它们在.NET的OO生态圈中的位置有问题 我曾考虑在.Net中使用线程和“内置”线程池类,并意识到它与您的代码在一个完全不同的级别上运行,对于Unity等IOC容器,它超出了IOC模式的范围 我不知道在IOC领域中有多少线程会存在,但如果可以将其视为一个类,那么它可能是包含在IOC框架中的候选线程。如果是这种情况,您将如何处理线程池的使用C# 如果使用IOC容器,在.net中使用线程池是否违反了(粗略地说)规则?,c#,.net,inversion-of-control,C#,.net,Inversion Of Control,我喜欢控制反转(IOC)模式,并经常使用它。像往常一样,我对线程以及它们在.NET的OO生态圈中的位置有问题 我曾考虑在.Net中使用线程和“内置”线程池类,并意识到它与您的代码在一个完全不同的级别上运行,对于Unity等IOC容器,它超出了IOC模式的范围 我不知道在IOC领域中有多少线程会存在,但如果可以将其视为一个类,那么它可能是包含在IOC框架中的候选线程。如果是这种情况,您将如何处理线程池的使用 这个评估是否正确。线程和IoC没有太多共同点。无论是否涉及螺纹,都可能发生松耦合。尝试为T
这个评估是否正确。线程和IoC没有太多共同点。无论是否涉及螺纹,都可能发生松耦合。尝试为Thread类提供接口是可能的,但是您不会抽象掉其他.NET framework类,是吗 以一个将以某种形式公开数据的服务为例。如果服务决定通过线程化提供异步行为,消费者将不得不考虑这一点。打电话给这项服务仍属于国际奥委会的职权范围
通过将服务作为接口公开,它可以根据需要进行更改,同时仍然提供所需的行为,在本例中,该行为将是异步行为。这将允许您在数据准备就绪后在接口中定义方法和回调/事件,同时仍然使用Unity和其他IoC框架。线程化和IoC没有太多共同点。无论是否涉及螺纹,都可能发生松耦合。尝试为Thread类提供接口是可能的,但是您不会抽象掉其他.NET framework类,是吗 以一个将以某种形式公开数据的服务为例。如果服务决定通过线程化提供异步行为,消费者将不得不考虑这一点。打电话给这项服务仍属于国际奥委会的职权范围
通过将服务作为接口公开,它可以根据需要进行更改,同时仍然提供所需的行为,在本例中,该行为将是异步行为。这将允许您在数据准备好后在接口中定义方法和回调/事件,同时仍然使用Unity和其他IoC框架。首先,我实际上从未直接使用
线程池,而是通过IoC容器解析接口IThreadPoolService
。这对于单元测试逻辑非常有用,因为线程方面会使事情变得更加困难,但不会给测试方面增加任何东西。我可以用非线程测试版本模拟服务
我不认为使用ThreadPool
违反了IoC,因为ThreadPool
实际上并不控制任务本身,它只负责调用入口点。它也不是“创造性的”,这是IoC容器的一个核心方面
使用IoC容器解析IThreadPoolService提供了添加间接层的常见好处,例如,您可以更改实现并添加其他行为,例如日志记录,当然可以通过IoC\DI支持这些行为。首先,我实际上从未直接使用线程池,但是有一个接口IThreadPoolService
,我通过IoC容器解析它。这对于单元测试逻辑非常有用,因为线程方面会使事情变得更加困难,但不会给测试方面增加任何东西。我可以用非线程测试版本模拟服务
我不认为使用ThreadPool
违反了IoC,因为ThreadPool
实际上并不控制任务本身,它只负责调用入口点。它也不是“创造性的”,这是IoC容器的一个核心方面
使用IoC容器解析IThreadPoolService
提供了添加间接层的常见好处,例如,您可以更改实现并添加其他行为,例如日志记录,当然可以通过IoC\DI支持这些行为。我同意线程类和IoC没有任何共同之处,但是我认为,线程池和实现自己的线程池模型的IOC可能存在利益冲突。@我不确定我是否这样认为。线程池只是框架的一部分。这又回到了询问您如何处理框架的其他部分?你有电话吗?当然不是。提供利用ThreadPool的服务是可以理解的,但是ThreadPool如何以任何方式与IoC概念相联系,而不是与任何其他结构相联系,这并不一定会影响IMHO。内置的配置类和所有其他无数静态类型的类也很好,比如文件等等。我想这是一个糟糕的代码,而且会有点味道。我认为同样,使用ThreadPool并不明确,这意味着你不能用更好/同等的东西代替它,这是IOC的另一项建议。我同意Thread Class和IOC没有任何共同之处,但是我认为,线程池和实现自己的线程池模型的IOC可能存在利益冲突。@我不确定我是否这样认为。线程池只是框架的一部分。这又回到了询问您如何处理框架的其他部分?你有电话吗?当然不是。提供一个利用线程池的服务是可以理解的,但是线程池如何以任何方式与IoC概念相联系,而不是与任何其他结构相联系,这并不一定会影响IMHO。内置的配置类和所有其他无数静态类型的类也可以,比如文件等。IMHO我会