在"写一个插件" MSDN文档说: 应该将插件的Execute方法编写为无状态,因为每次调用插件时都不会调用构造函数。此外,多个系统线程可以同时执行插件。
我想知道让Execute方法无状态是什么意思?
答案 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的组合。