我们正在通过继承IPlugin
在Microsoft Dynamics CRM中构建一些插件。我们已经配置了这些,因此每当更新Account
时,它们就会激发。
问题是插件正在调用我们的服务,这导致我们的服务以更新响应。我们现在正在做一些非常棘手的事情来防止这些周期性的更新发生。
我们想知道是否有一种方法可以将值传递给IOrganizationService
服务(web服务),让插件查看。我们的另一个系统可以发送一个标志("嘿,不要麻烦发送更新!"),插件可以跳过回调。
我们可以将参数从web服务传递到插件吗?
最好使用自定义标志字段。例如,添加位字段并将其称为CallFromExternalSystem。因此,当您通过IOranizationService从外部系统进行更新时,您只需用true字段填充此标志,在插件中,您可以检查字段列表中是否存在此字段,这样您就不需要再次调用外部系统端点。
我们决定正确的解决方案是使用IPluginExecutionContext.InputParameters["Target"]
中的值。在Update
的情况下,这将返回一个Entity
,其中包含已更新的所有属性的属性。
我们基本上有一个我们关心的属性名称列表。我们循环遍历名称,看看它们中是否有任何一个出现在实体属性列表中。如果是,我们会向其他系统发送更新。好消息是,Dynamics CRM会忽略值实际上没有更改的更新,因此尝试将值更新为自身是不可行的。
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity entity = (Entity)context.InputParameters["Target"];
string[] fields = new string[] { "name", "statecode", "address1_line1" };
bool hasUpdates = fields.Where(f => entity.Attributes.Contains(f)).Any();
if (!hasUpdates)
{
return;
}
}