我正在为Dynamics CRM(2015和CRM Online)的自定义C#插件进行插件注册。
使用Visual Studio CRM Explorer创建新插件时,您将获得标准的“Create Plug-in”对话框:
在“管道阶段”下,有三个选项:
在此处选择Post-Operation
会导致此代码被添加到XML注册文件中:
<Plugin Description="..." FriendlyName="PostContactCreate" Name="Cacheron.PostContactCreate" Id="00000000-0000-0000-0000-000000000000" TypeName="Cacheron.PostContactCreate">
<Steps>
<clear />
<Step CustomConfiguration="" Name="PostContactCreate" Description="Post-Operation of Contact Create" Id="00000000-0000-0000-0000-000000000000" MessageName="Create" Mode="Synchronous" PrimaryEntityName="contact" Rank="1" SecureConfiguration="" Stage="PostOutsideTransaction" SupportedDeployment="ServerOnly">
<Images />
</Step>
</Steps>
</Plugin>
关键部分是中间线,其中显示Stage="PostOutsideTransaction"
该工具生成的相应C#代码包含以下行:
base.RegisteredEvents.Add(
new Tuple<int, string, string, Action<LocalPluginContext>>(
40,
"Create",
"contact",
new Action<LocalPluginContext>(ExecutePostContactCreate)
)
);
插件注册中的幻数40似乎与https://msdn.microsoft.com/en-gb/library/gg327941.aspx中记录的“管道阶段”相对应,后者表示
事件后
后操作
40
在主要操作之后执行的插件的管道中的阶段。在此阶段注册的插件在数据库事务中执行。
所以我已经通过明确说明 PostOutsideTransaction 的工具生成了注册XML,以及由指定阶段40的同一工具生成的C#代码,该工具在数据库事务中“执行 “
那是哪个? XML注册语法是否使用误导性名称,或者这是插件创建工具中的错误,还是执行管道做了一些我不理解的聪明事情?
答案 0 :(得分:3)
这取决于您的帖子操作插件步骤注册的消息。对于最常见的消息,该步骤在数据库事务中执行:
Create
Update
Delete
SetState
Assign
可以在数据库事务之外执行一些其他消息,例如, Publish
和PublishAll
以及其他Retrieve
,RetrieveMultiple
。
在IPluginExecutionContext
对象中,您可以查看IsInTransaction
属性。
答案 1 :(得分:2)
40绝对是后期操作和交易内部。您可以很容易地判断出这种情况,因为如果您的stage 40插件步骤抛出异常,则触发插件的整个操作将被回滚。
在一个不相关的说明中,我强烈建议您从SDK中放弃开发人员工具包。由于多种原因,它很麻烦且非常烦人。我强烈推荐免费和开源CRM Developer Extensions,它会更好。