Dynamics crm 2011 Microsoft Dynamics CRM 2011中的工作流和插件最佳实践

Dynamics crm 2011 Microsoft Dynamics CRM 2011中的工作流和插件最佳实践,dynamics-crm-2011,Dynamics Crm 2011,我最近开始在Execute方法中获取CRM对象,并在单独的方法中执行插件/工作流业务逻辑。 这种方法可以改进还是放弃? 使用LINQ获取工作流的目标记录是否可以接受? 它比输入参数更方便;此外,工作流是异步的,不会影响用户体验 对于插件: 公共类AddEmailAttachments:IPlugin { 私有void AddAttachmentsEntity目标、IOOrganizationService服务、上下文linq { //业务逻辑 } /* *获取我们需要的所有对象 *并调用AddA

我最近开始在Execute方法中获取CRM对象,并在单独的方法中执行插件/工作流业务逻辑。 这种方法可以改进还是放弃? 使用LINQ获取工作流的目标记录是否可以接受? 它比输入参数更方便;此外,工作流是异步的,不会影响用户体验

对于插件:

公共类AddEmailAttachments:IPlugin { 私有void AddAttachmentsEntity目标、IOOrganizationService服务、上下文linq { //业务逻辑 } /* *获取我们需要的所有对象 *并调用AddAttachments * */ public void executeServiceProvider服务提供者 { IPluginExecutionContext上下文=null; IOOrganizationServiceFactory工厂=空; IOOrganizationService=null; 实体目标=null; 上下文linq=null; 尝试//并获得我们需要的服务 { context=IPluginExecutionContextserviceProvider.GetServicetypeofIPluginExecutionContext; factory=IOOrganizationServiceFactoryServiceProvider.GetServiceTypeOfOrganizationServiceFactory; 服务=factory.CreateOrganizationServicecontext.UserId; target=Entitycontext.InputParameters[target]; linq=新的上下文服务; 如果服务!=null&&target!=null&&linq!=null AddAttachmentstarget、服务、linq; } 捕获异常{};//这是严格的,因为如果此插件失败,则不会在CRM中创建电子邮件并中断业务流程 } } 对于工作流:

公共类SendCaseNotifications:CodeActivity { /*接收必要的对象和 *发送电子邮件 * */ 私人无效发送通知事件、IOR组织服务、电子邮件、上下文linq { //执行业务逻辑 } /*获取所需的对象并调用 *方法 * */ 受保护的覆盖无效ExecuteCodeActivityContext上下文 { IWorkflowContext workflowContext=context.GetExtension; IOOrganizationServiceFactory工厂=context.GetExtension; IOOrganizationService=factory.CreateOrganizationServiceworkflowContext.InitiatingUserId; 实体目标=workflowContext.InputParameters[target]作为实体; 事件=空; 电子邮件=空; Context linq=新的Contextservice; IEnumerable incidentQuery=来自linq.IncidentSet中的事件,其中incidents.Id.equalTarget.Id选择事件; 如果有,请询问 incident=incidentQuery.First; 如果事件==null 抛出新的InvalidPlugineExecutionException无法检索id为:+target.id.ToString+的案例。请重试该操作或与系统管理员联系。; IEnumerable emailQuery=来自linq.EmailSet中的电子邮件,其中emails.Id.Equalsincident.mda_origing email.Id选择电子邮件; 如果是emailQuery,有吗 email=emailQuery.First; 如果电子邮件==null 抛出新的InvalidPlugineExecutionException无法检索id为:+incident.mda_OriginagingEmail.id.ToString+的电子邮件。请重试该操作或与系统管理员联系。; 发送通知事件、服务、电子邮件、linq; } } 我在Execute中尽可能多地处理异常,然后将对象传递给执行实际工作的方法。 我最近了解到,如果同步插件抛出异常,它会影响业务流程

1=>这种方法可以改进还是放弃

您可以通过两种方式来改进这一点。你能改进这一点的最大方法是为你的插件和工作流活动创建一个基类,它能自动完成所有必要的上下文提取,orgservice,您甚至可以更进一步,让创建/更新/删除/设置状态/etc插件的基类适当地提取输入和输出参数

其次,如果您想进行完整的OO设计,您可以将所有业务逻辑放在单独的类中,而不是函数中。对于复杂的逻辑,它将更少耦合,更具组织性,如果您想要进行单元测试,它将是可测试的

2=>使用LINQ获取工作流的目标记录是否可以接受

我认为问题是,使用LINQ检索工作流的当前记录是否是一种良好的做法?你做这件事的方式没有任何问题。您可能只需要使用LINQ扩展方法FirstOrDefault而不是 任何一个都可以

一般来说,Crm检索只返回所需的列是一种很好的做法。虽然您在检索一条记录时可能没有注意到这一点,但如果您正在检索多条记录,则一定要这样做。

可能存在重复的记录