0

我只是在 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);
             }
         }
     }
  }
4

2 回答 2

7

从外观上看,您有两个当前托管您的 CRM 实例的应用程序网络服务器(或者这些是异步插件,在这种情况下,您有两个异步服务器为您的 CRM 实例提供服务)每个服务器都有自己的本地版本MyPlugin.count,即为什么你会看到奇怪的行为。

CRM 中的应用程序域对于非沙盒插件来说稍微简单一些,它是每个 Crm Web 服务器一个。沙盒插件有点棘手。插件的每个注册步骤,都有自己独特的域。这需要 CRM 数据库(或 CRM 外部的其他东西)以使这些值保持同步。

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

更新:错误已解决。

于 2016-02-26T05:03:10.817 回答
5

正如 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

于 2016-02-25T07:41:51.517 回答