Plugin开发基本知识点 IPluginExecutionContext, iOrganization Service
`IPluginExecutionContext` 接口在Microsoft Dynamics 365插件开发中用于获取有关当前插件执行上下文的信息。它提供了丰富的属性和方法,帮助开发者在插件执行时获取与当前操作相关的各种数据和元数据。以下是`IPluginExecutionContext`的一些主要功能和属性:
### 主要属性
1. **MessageName**:表示当前执行的消息名称(如 "Create", "Update", "Delete", "Retrieve")。
string messageName = context.MessageName;
2. **PrimaryEntityName**:表示当前操作涉及的主要实体的名称。
string primaryEntityName = context.PrimaryEntityName;
3. **PrimaryEntityId**:表示当前操作涉及的主要实体的ID。
Guid primaryEntityId = context.PrimaryEntityId;
4. **InputParameters**:包含传递给插件的输入参数。
ParameterCollection inputParams = context.InputParameters;
5. **OutputParameters**:包含插件执行后返回的输出参数。
ParameterCollection outputParams = context.OutputParameters;
6. **PreEntityImages** 和 **PostEntityImages**:包含实体的预操作和后操作图像(即操作前后的实体状态)。
Entity preImage = (Entity)context.PreEntityImages["PreImage"]; Entity postImage = (Entity)context.PostEntityImages["PostImage"];
7. **SharedVariables**:在插件和自定义工作流活动之间共享数据的变量集合。
ParameterCollection sharedVariables = context.SharedVariables;
8. **Depth**:表示插件调用的嵌套深度,用于避免无限循环调用。
int depth = context.Depth;
9. **UserId**:表示当前操作的用户ID。
Guid userId = context.UserId;
10. **InitiatingUserId**:表示发起操作的用户ID。
Guid initiatingUserId = context.InitiatingUserId;
11. **OrganizationId** 和 **OrganizationName**:表示组织的ID和名称。
Guid organizationId = context.OrganizationId; string organizationName = context.OrganizationName;
12. **IsExecutingOffline**:指示插件是否在离线模式下执行。
bool isOffline = context.IsExecutingOffline;
13. **IsInTransaction**:指示当前插件执行是否在事务中。
bool isInTransaction = context.IsInTransaction;
14. **Mode**:表示插件执行模式(同步或异步)。
int mode = context.Mode;
### 使用示例
在插件中,你可以通过`IServiceProvider`获取`IPluginExecutionContext`,然后访问上述属性和方法。例如:
public class MyPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); // 获取当前操作的消息名称 string messageName = context.MessageName; // 获取主要实体的名称 string primaryEntityName = context.PrimaryEntityName; // 获取输入参数 if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) { Entity entity = (Entity)context.InputParameters["Target"]; // 执行自定义逻辑 } // 获取预操作图像 if (context.PreEntityImages.Contains("PreImage")) { Entity preImage = (Entity)context.PreEntityImages["PreImage"]; // 执行自定义逻辑 } } }
通过`IPluginExecutionContext`,开发者可以方便地获取与当前操作相关的各种信息,从而在插件中实现复杂的业务逻辑。
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);