我们通过继承IPlugin
在Microsoft Dynamics CRM中构建一些插件。我们对这些进行了配置,以便在更新Account
时触发。
问题是插件正在调用我们的服务,这会导致我们的服务响应更新。我们现在正在做一些非常糟糕的事情,以防止这些周期性更新发生。
我们想知道是否有办法将值传递给插件可以查看的IOrganizationService
服务(Web服务)。我们的其他系统可以发送一个标志("嘿,不要发送更新!")插件可以跳过回叫。
我们可以将参数从Web服务传递到插件吗?
答案 0 :(得分:0)
好主意可能是使用自定义标志字段。例如,您添加位字段并将其命名为CallFromExternalSystem。因此,当您通过IOranizationService从外部系统进行更新时,只需使用true字段填充此标志,在插件中,您可以检查字段列表中是否存在此字段的条件,因此您无需再次调用外部系统端点。
答案 1 :(得分:0)
我们认为正确的解决方案是使用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;
}
}