这是什么意思:插件的Execute方法应该写成无状态的?

时间:2014-05-05 14:54:13

标签: dynamics-crm-2011 dynamics-crm

在"写一个插件" MSDN文档说: 应该将插件的Execute方法编写为无状态,因为每次调用插件时都不会调用构造函数。此外,多个系统线程可以同时执行插件。

我想知道让Execute方法无状态是什么意思?

1 个答案:

答案 0 :(得分:3)

无状态方法是一种不影响或不依赖于全局状态或其状态的方法。定义对象,执行时。

在你的情况下,它必须:

  • 执行时不依赖于插件对象的状态
  • 执行
  • 时不更改插件的状态

这是一个方法不是无状态的例子;

class StatefulSum
{
     private int a;
     private int b;

     public void SetA(int value) {
         a = value;
     }

     public void SetB(int value) {
         b = value;
     }

     public int ComputeSum() {             
         return a + b;
     }
}

这是一个非无状态方法的更微妙的例子:

class SubtleStatefulSum
{      
     private int partialSum;

     // Looks like it's stateless but it's not and in a 
     //  concurrent environment this method is a recipe for disaster
     public int ComputeSum(int a, int b)
     {           
         partialSum = 0;
         partialSum = partialSum + a;
         partialSum = partialSum + b;
         return partialSum;
     }
}

这是无状态方法的基本示例。

class BasicStateless
{      
     public int ComputeSum(int a, int b)
     {             
         return a + b;
     }
}

当然,可以使用更复杂的机制(例如Dynamics CRM插件的情况,通过IServiceProvider参数)在运行时获取计算参数。

你可以想象有一个像这样的无状态方法:

class Stateless2
{
     public int ComputeSum(IServiceProvider provider)
     {
         var numService = (INumberService)provider.GetService(typeof(INumbersService));

         int a = numService.GetNumberA();
         int b = numService.GetNumberB();

         return a + b;
     }
}

IServiceProvider实例知道如何检索实现INumberService接口的对象,而该接口又知道如何检索数字A和B.这是Dependency Injection and Inversion of Control的组合。