Dynamics crm 有没有办法自动强制执行插件

Dynamics crm 有没有办法自动强制执行插件,dynamics-crm,fakexrmeasy,Dynamics Crm,Fakexrmeasy,我希望插件自动触发。FakeXrmEasy支持这一点吗? 我尝试了以下插件: public class Foo : IPlugin { public void Execute(IServiceProvider serviceProvider) { // never breaks here } } public static EntityMetadata SetObjectTypeCode(

我希望插件自动触发。FakeXrmEasy支持这一点吗? 我尝试了以下插件:

    public class Foo : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            // never breaks here
        }
    }


    public static EntityMetadata SetObjectTypeCode(EntityMetadata metadata, int value)
    {
        var property = typeof(EntityMetadata).GetProperty(nameof(metadata.ObjectTypeCode));
        property.SetValue(metadata, value);
        return metadata;
    }


    static void Main(string[] args)
    {
        var context = new XrmFakedContext();
        context.InitializeMetadata(SetObjectTypeCode(new EntityMetadata
        {
            LogicalName = "account",
        }, 1));

        context.RegisterPluginStep<Foo>("Create", primaryEntityTypeCode: 1);
        context.GetOrganizationService().Create(new Entity("account", Guid.NewGuid()));
    }
公共类Foo:IPlugin
{
public void Execute(IServiceProvider服务提供程序)
{
//这里从不休息
}
}
公共静态EntityMetadata SetObjectTypeCode(EntityMetadata元数据,int值)
{
var property=typeof(EntityMetadata).GetProperty(nameof(metadata.ObjectTypeCode));
SetValue(元数据、值);
返回元数据;
}
静态void Main(字符串[]参数)
{
var context=new XrmFakedContext();
context.InitializeMetadata(SetObjectTypeCode)(新EntityMetadata
{
LogicalName=“帐户”,
}, 1));
RegisterPluginStep(“创建”,primaryEntityTypeCode:1);
context.GetOrganizationService().Create(新实体(“帐户”,Guid.NewGuid()));
}

但是插件永远不会执行。

这是因为框架使用实体的
EntityTypeCode
字段来获取注册的插件

此字段不是
实体
基类的一部分,但存在于由crmsvcutil生成的早期绑定类中


另外,默认情况下,
XrmFakedContext
实例的
UsePipelineSimulation
属性为false,因此不会运行任何插件,您必须将其设置为
true

,如果有人感兴趣,则最后的代码片段如下所示:

var context=newxrmfakedcontext{UsePipelineSimulation=true};
RegisterPluginStep(“Create”,ProcessingStepStage.Postoperation);
var organizationService=context.GetOrganizationService();
创建(新帐户{LogicalName=“Account”});
必须考虑实体元数据(所有),如:

[EntityLogicalNameAttribute(“帐户”)]
公共类帐户:实体
{
[属性逻辑名称(“名称”)]
公共字符串名称{get;set;}
公共int实体类型代码;
公共帐户()
{
this.EntityTypeCode=1;
}
}
仅包括系统元数据:

[EntityLogicalName(“插件类型”)]
公共类插件类型:实体
{
[属性逻辑名称(“插件类型ID”)]
公共Guid插件类型ID{get;set;}
[属性逻辑名称(“名称”)]
公共字符串名称{get;set;}
[属性逻辑名称(“类型名称”)]
公共字符串类型名{get;set;}
[属性逻辑名称(“assemblyname”)]
公共字符串AssemblyName{get;set;}
[属性逻辑名称(“专业”)]
公共int主键{get;set;}
[属性逻辑名称(“次要”)]
public int Minor{get;set;}
[属性逻辑名称(“版本”)]
公共字符串版本{get;set;}
}
[EntityLogicalName(“sdkmessage”)]
公共类SdkMessage:实体
{
[属性逻辑名称(“sdkmessageid”)]
公共Guid SdkMessageId{get;set;}
[属性逻辑名称(“名称”)]
公共字符串名称{get;set;}
}
[EntityLogicalName(“sdkmessagefilter”)]
公共类SdkMessageFilter:实体
{
[属性逻辑名称(“sdkmessagefilterid”)]
公共Guid SdkMessageFilterId{get;set;}
[属性逻辑名称(“primaryobjecttypecode”)]
public int PrimaryObjectTypeCode{get;set;}
}
[EntityLogicalName(“sdkmessageprocessingstep”)]
公共类SdkMessageProcessingStep:实体
{
[属性逻辑名称(“配置”)]
公共字符串配置{get;set;}
[属性逻辑名称(“eventhandler”)]
公共EntityReference事件处理程序{get;set;}
[属性逻辑名称(“sdkmessageid”)]
公共实体引用SdkMessageId{get;set;}
[属性逻辑名称(“sdkmessagefilterid”)]
公共实体引用SdkMessageFilterId{get;set;}
[属性逻辑名称(“filteringattributes”)]
公共字符串筛选器属性{get;set;}
[属性逻辑名称(“模式”)]
公共选项SetValue模式{get;set;}
[属性逻辑名称(“阶段”)]
公共选项SetValue阶段{get;set;}
[属性逻辑名称(“等级”)]
公共整数秩{get;set;}
}

我明白了-因此框架对每个使用crmsvcutil工具的人都做出了强有力的假设。这似乎不是一个明智的设计选择-使用实体的LogicalName将更接近平台的实际工作方式。实际上,CRM使用这种类型代码来过滤SKDMessage。我认为这里缺少的链接是,当没有提供类型代码时,测试框架不会搜索元数据。