这是一个真实示例: 为 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% 的情况下,它会导致出现问题,并且开发人员很难找出问题所在,并且在他们进行测试/调试时可能永远不会发生。