Dynamics crm 2011 它是什么意思:插件';的执行方法是否应写入为无状态?

Dynamics crm 2011 它是什么意思:插件';的执行方法是否应写入为无状态?,dynamics-crm-2011,dynamics-crm,Dynamics Crm 2011,Dynamics Crm,在“编写插件”文档中,它说: 插件的Execute方法应该写为无状态,因为不是每次调用插件都调用构造函数。此外,多个系统线程可以同时执行插件 我想知道执行方法无状态到底意味着什么?无状态方法是一种在执行时既不影响也不依赖全局状态或其“定义对象”状态的方法 在您的情况下,它必须: 不依赖于执行时插件对象的状态 执行时不更改插件的状态 下面是一个示例,其中一个方法不是无状态的 class StatefulSum { private int a; private int b;

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


我想知道执行方法无状态到底意味着什么?

无状态方法是一种在执行时既不影响也不依赖全局状态或其“定义对象”状态的方法

在您的情况下,它必须:

  • 不依赖于执行时插件对象的状态
  • 执行时不更改插件的状态
下面是一个示例,其中一个方法不是无状态的

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;
     }
}
当然,可以在运行时通过IServiceProvider参数使用更复杂的机制(如Dynamics CRM插件的情况)获得计算参数

您可以想象有这样一个无状态方法:

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接口的对象,而INumberService接口又知道如何检索数字A和B。这是两者的组合。

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

在您的情况下,它必须:

  • 不依赖于执行时插件对象的状态
  • 执行时不更改插件的状态
下面是一个示例,其中一个方法不是无状态的

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;
     }
}
当然,可以在运行时通过IServiceProvider参数使用更复杂的机制(如Dynamics CRM插件的情况)获得计算参数

您可以想象有这样一个无状态方法:

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接口的对象,而INumberService接口又知道如何检索数字A和B。这是两者的组合。

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

在您的情况下,它必须:

  • 不依赖于执行时插件对象的状态
  • 执行时不更改插件的状态
下面是一个示例,其中一个方法不是无状态的

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;
     }
}
当然,可以在运行时通过IServiceProvider参数使用更复杂的机制(如Dynamics CRM插件的情况)获得计算参数

您可以想象有这样一个无状态方法:

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接口的对象,而INumberService接口又知道如何检索数字A和B。这是两者的组合。

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

在您的情况下,它必须:

  • 不依赖于执行时插件对象的状态
  • 执行时不更改插件的状态
下面是一个示例,其中一个方法不是无状态的

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;
     }
}
当然,可以在运行时通过IServiceProvider参数使用更复杂的机制(如Dynamics CRM插件的情况)获得计算参数

您可以想象有这样一个无状态方法:

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接口的对象,而INumberService接口又知道如何检索数字A和B。这是两者的组合。

那么这是否意味着在Execute方法案例中,在该方法中声明插件中的所有变量,而不是在类中声明它们?是,execute方法必须接受所有必需的参数,而不依赖于插件中存储的任何变量?正确吗?@NawafKhalife,该方法也可能在执行时从某些外部存储库请求其参数,但是它并没有回复插件本身来存储这些设置。谢谢你的帮助。那么这是否意味着在Execute方法案例中,在该方法中声明插件中的所有变量,而不是在类中声明它们?是的,Execute方法必须接受所有必需的参数,所以如果我说:类B{public int ComputeSum(){int a=1;int B=2;返回a+B;}},那么ComputeSum方法是statelss?正确吗?@NawafKhalife,该方法也可能在执行时从某些外部存储库请求其参数,但是它并没有回复插件本身来存储这些设置。谢谢你的帮助。那么这是否意味着在Execute方法案例中,在该方法中声明插件中的所有变量,而不是在类中声明它们?是的,Execute方法必须接受所有必需的参数,并且不依赖于插件中存储的任何变量