Dynamics CRM 2016插件全局变量

时间:2016-02-25 07:23:51

标签: c# global-variables dynamics-crm dynamics-crm-2016

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

Log image

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

 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);
             }
         }
     }
  }

2 个答案:

答案 0 :(得分:7)

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

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

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

更新:错误已经解决。

答案 1 :(得分: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