Plugin开发基本知识点 IPluginExecutionContext, iOrganization Service

IPluginExecutionContext

`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`,开发者可以方便地获取与当前操作相关的各种信息,从而在插件中实现复杂的业务逻辑。

 

 

 

iOrganization Service

        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
 

`IOrganizationService` 接口是Microsoft Dynamics 365 SDK中的一个关键接口,提供了与Dynamics 365实例进行交互的核心方法。通过这个接口,你可以执行多种操作,如CRUD(创建、读取、更新、删除)操作、检索元数据以及执行组织服务中的其他操作。

以下是`IOrganizationService`接口提供的一些主要功能:

1. **创建记录:**
- 使用`Create`方法在Dynamics 365中创建一个新的记录。

Guid recordId = service.Create(entity);

 

2. **检索记录:**
- 使用`Retrieve`方法根据实体类型和记录ID检索单个记录。

Entity retrievedEntity = service.Retrieve("account", recordId, new ColumnSet(true));

 

3. **更新记录:**
- 使用`Update`方法更新现有记录。

service.Update(entity);

 

4. **删除记录:**
- 使用`Delete`方法删除指定的记录。

service.Delete("account", recordId);

 

5. **执行查询:**
- 使用`RetrieveMultiple`方法执行查询以检索多个记录。

QueryExpression query = new QueryExpression("account");
EntityCollection results = service.RetrieveMultiple(query);

 

6. **执行组织服务操作:**
- 使用`Execute`方法执行特定的组织服务操作或消息。

ExecuteTransactionRequest request = new ExecuteTransactionRequest
{
    Requests = new OrganizationRequestCollection
    {
        new CreateRequest { Target = newAccount },
        new UpdateRequest { Target = existingAccount }
    }
};
ExecuteTransactionResponse response = (ExecuteTransactionResponse)service.Execute(request);

 

TransactionResponse response = (ExecuteTransactionResponse)service.Execute(request);
```

7. **检索元数据:**
- 可以通过执行特定的组织服务请求来检索Dynamics 365的元数据(如实体、字段定义等)。

RetrieveEntityRequest retrieveEntityRequest = new RetrieveEntityRequest
{
    LogicalName = "account",
    EntityFilters = EntityFilters.All
};
RetrieveEntityResponse retrieveEntityResponse = (RetrieveEntityResponse)service.Execute(retrieveEntityRequest);

 

这些功能使得`IOrganizationService`成为在Dynamics 365插件和自定义工作流活动中与数据和元数据进行交互的主要方式。

posted @ 2024-07-03 17:21  TheMiao  阅读(7)  评论(0编辑  收藏  举报