什么是无状态类?

ash*_*ina 2 class stateless c#-4.0

我想知道无状态类的缺点是什么(如果有的话)?有没有人见过一个真实世界的应用程序,其中一些用例要求创建一个无状态类(No hello world please)?我认为无状态类意味着没有任何字段的类。

Wed*_*dge 6

这是一个真实示例: 为 Microsoft Dynamics CRM 编写插件

在该文档中,您将看到一条说明:“插件的 Execute 方法应编写为无状态”。基本上,成为无状态类的意思是不应该有全局变量(除了一些特殊情况,除非被问到,否则我不会涉及)。

为什么是这样的原因授权通过CRM基于插件的开发者是因为CRM试图通过缓存和重新使用插件类的实例,以提高性能。CRM 执行其插件的方式大致如下:

主线:

YourCustomPlugin yourCustomPluginCached = new YourCustomPlugin();
Run Code Online (Sandbox Code Playgroud)

然后稍后: Thread1:

yourCustomPluginCached.Execute(context1);
Run Code Online (Sandbox Code Playgroud)

和线程2:

yourCustomPluginCached.Execute(context2);
Run Code Online (Sandbox Code Playgroud)

一些开发人员做错的是他们会创建一个全局变量来存储上下文,他们将其设置为 Execute() 方法的第一行。这样他们就不必在所有方法之间传递它。但这实际上是一个巨大的错误。因为如果他们这样做,并且在上面的场景中,如果线程 2 中的执行在线程 1 的执行完成之前开始。这意味着线程 1 中的上下文 1 将被上下文 2 覆盖。现在那个插件会有一些意想不到的结果。在 99% 的情况下,即使以这种方式错误地开发,也没有问题,或者没有明显的问题。但是在 1% 的情况下,它会导致出现问题,并且开发人员很难找出问题所在,并且在他们进行测试/调试时可能永远不会发生。