Crm 2011如何获取插件执行的stepid

时间:2012-12-26 16:45:19

标签: plugins dynamics-crm-2011 dynamics-crm

在crm 2011中,在插件的Execute方法中,我如何知道正在执行的已注册步骤的id?例如,我有两个步骤来预先创建一个帐户。 execute方法将为每个步骤运行两次。我需要在execute方法中知道实际运行的步骤的stepid。我无法在上下文中找到它。

更新:

我在这里更新以解释这个场景,因为在评论中我没有足够的字符。场景如下:

我有自动编号实体的解决方案,使用户能够按照自己的方式格式化数字。

为此我有一个实体(自动编号),在那里他们配置他们想要编号的格式,实体和字段。每次为自动编号实体创建记录时,它将在要编号的实体的创建消息的预操作中动态地创建和注册步骤,例如帐户。 执行该步骤时,它将加载自动编号记录,以了解如何为帐户字段编号。

创建的步骤必须链接到自动编号记录,并且自动编号实体具有存储步骤ID的属性。创建步骤时,将在创建自动编号实体时填充此属性。 此链接属性允许在用户删除自动编号记录时取消注册该步骤,因为它确切地知道取消注册的步骤。如果有更多的插件注册到帐户,它还允许用户设置步骤的执行顺序。

我遇到的问题是当我想为同一个实体编号2个或更多属性时。在这种情况下,用户将创建,例如,自动编号实体的2个记录,以便编号帐户的2个字段。在这种情况下,我将在帐户中注册两个步骤。创建帐户时,一个步骤将编号一个字段,另一个步骤将编号另一个字段。这就是为什么我需要知道为了加载正确的自动编号记录而正在执行的步骤的id。

对于繁琐的解释感到抱歉,但这种情况有点复杂,我不确定我是否足够清楚,但如果你想要我会更加清楚。

2 个答案:

答案 0 :(得分:3)

IPluginExecutionContext上提供的OwningExtension属性会向EntityReference返回SdkMessageProcessingingStep,该{{1}}应提供您需要的所有信息。

你想通过为同一个Message和Stage注册两次相同的插件来实现什么目的?我很难想到一个有效的场景。

答案 1 :(得分:1)

您可以从上下文中获取消息的名称。通常,我会做类似的事情。

public void Execute(IServiceProvider serviceProvider)
{
  IPlugingExecutionContext context 
    = (IPlugingExecutionContext)serviceProvider
      .getService(typeof(IPlugingExecutionContext));

  switch(context.MessageName)
  {
    case "Create" ExecuteCreate(); break;
    case "Retrieve" ExecuteCreate(); break;
    case "Update" ExecuteCreate(); break;
    case "Delete" ExecuteCreate(); break;
    default ExecuteFunctionality(Context.MessageName);
  }
}

然后,当然,您也需要实现这些方法。通常我有一个私有字段,其中包含对 context 的引用。能够在需要时轻松访问它是件好事。此外,您可以(并且应该)检查插件是否支持该消息,是否存在目标以及它是否为正确的实体类型。这样的东西。