Dynamics CRM 2016插件全局变量

我只是在Dynamics CRM 2016插件中增加静态全局变量,它显示奇怪的随机模式,如下所示。 为什么它表现出奇怪的行为和模式?

记录图像

以下是我正在使用的代码。

public class MyPlugin : IPlugin { private static int count = 0; public void Execute(IServiceProvider serviceProvider) { try { if (_objContext.InputParameters.Contains("Target") && _objContext.InputParameters["Target"] is Entity) { WriteLog("Count value before increament: " + count, service); count = count + 1; WriteLog("Count value after increament: "+count, service); } } } } 

从它的外观来看,您有两个当前托管您的CRM实例的应用程序Web服务器(或者这些是异步插件,在这种情况下,您有两个服务于您的CRM实例的异步服务器)每个服务器都有自己的本地版本的MyPlugin.count这就是你看到奇怪行为的原因。

CRM中的应用程序域对于未经过装箱的插件来说有点简单,它是每个Crm Web服务器的一个。 沙盒插件有点棘手。 插件的每个注册步骤都有自己独特的域名。 这需要CRM数据库(或CRM外部的其他内容)才能使这些值保持同步。

我创建了一个自动编号解决方案 ,使用CRM 2015中新增的版本function,可以实现乐观的更新。 但不幸的是,微软有一个错误,其中版本号为沙盒插件为空,因此它只能在本地环境中工作,直到错误得到解决。

更新:错误已解决。

正如MS在MSDN中所说:

为了提高性能,Microsoft Dynamics CRM缓存插件实例。 应该将插件的Execute方法编写为无状态,因为每次调用插件时都不会调用构造函数。 此外,多个系统线程可以同时执行插件。 所有每个调用状态信息都存储在上下文中,因此您不应使用全局变量或尝试将任何数据存储在成员变量中,以便在下一个插件调用期间使用…

https://msdn.microsoft.com/en-us/library/gg328263.aspx

简单地说,不要在插件中使用局部变量。 如果您正在寻找自动编号而不是使用类似于此的方法https://www.linkedin.com/pulse/custom-auto-numbering-6-quick-steps-ms-dynamics-crm-eran-fuks