导航

MS CRM 4.0------插件开发

Posted on 2009-05-15 10:52  鸡尾虾的壳  阅读(403)  评论(0编辑  收藏  举报

MS CRM 4.0 SDK下载地址:
   http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&displaylang=en

插件示例代码:
public void Execute(IPluginExecutionContext context)
{
   DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"];
   if (entity.Name == EntityName.account.ToString())
        {
            Guid id = (Guid)context.OutputParameters.Properties["Id"];
            Key myKey = new Key(id);
            if (!entity.Properties.Contains("accountid"))
            {
                entity.Properties["accountid"] = myKey;
            }
            if (!entity.Properties.Contains("description"))
            {
                entity.Properties["description"] = "GUID = " + id.ToString();
                ICrmService service = context.CreateCrmService(true);
                service.Update(entity);
            }
        }
    }

分析:
    context.InputParameters:触发事件的Request Message的参数,类型是PropertyBag。根据PropertyBag类的描述,它代表实体实例。也就是说这个实体实例的某个事件,如创建或者修改或者删除,触发了当前插件的执行。实体实例是由很多Property构成的,所以它的Properties属性保存了它的所有Property的集合。在这个集合中,有一个名称为"Target"的属性,通过集合的["Target"]操作取得"Target"属性的值。这个值的实际类型是DynamicEntity,而集合中返回的的是通用的Object类型,所以通过(DynamicEntity)强制转换。
    DynamicEntity:只有实体名称和一组属性的BusinessEntity。系统和自定义实体是有强类型属性的BusinessEntity。一个实体实例都应该有一个唯一的标识,类似于数据库中的记录主键。当一个实体还在插件阶段处理时,在CRM后台数据库中可能还不存在,有些信息还没有最后确定,所以称为动态的。
    entity.Name:这个动态实体的名称。
    EntityName:SDK中定义的一个Enum类型,包括了所有内建的实体名称。EntityName.account代表系统的帐户实体。EntityName.account.ToString()表示帐户实体的实体名称。整个条件语句标识判断动态实体是否是帐户实体。
    context.OutputParameters:与context.InputParameters类似。代表经过插件处理后的Response Message的参数,也是PropertyBag类型的对象。整行是返回名称为"Id"的属性的属性值。这个值的实际类型是System.Guid类型。
     Key myKey = new Key(id):通过id对象构造Key对象。对于任何一个实体实例来说,都有一个Key对象作为它的唯一标识。
     if (!entity.Properties.Contains("accountid")):如果这个动态实体是accoun类型的实体,那么它的属性集合中一定是包含名称为"accountid"的属性。通过集合的Contains方法来做判断。
     entity.Properties["accountid"] = myKey:给这个动态帐户实体赋一个id值。根据account实体的定义,这个id值必须存储在"accountid"属性中。
     if (!entity.Properties.Contains("description")):如果动态实体中不包含"description"属性。
     entity.Properties["description"] = "GUID = " + id.ToString():给动态实体实例创造一个"description"属性,并且给它赋值。
     ICrmService service = context.CreateCrmService(true):通过context获取ICrmService。后者提供web service的形式让开发者可以对实体实例进行操作的功能。
     service.Update(entity):把动态实体更新保存到后台。
 
参考信息:sdk\crmsdk4.chm