C# 在(Dynamics)CRM中初始化构造函数中属性的替代方法
我目前正在开发一个定制CRM风格的解决方案(EF/Winforms/OData WebApi),我想知道如何实现一个非常简单的需求: 假设有一个简单的C# 在(Dynamics)CRM中初始化构造函数中属性的替代方法,c#,oop,dynamics-crm,crm,C#,Oop,Dynamics Crm,Crm,我目前正在开发一个定制CRM风格的解决方案(EF/Winforms/OData WebApi),我想知道如何实现一个非常简单的需求: 假设有一个简单的项目实体。可以为其分配任务。项目中定义了一个DefaultTaskResponsible。每当创建任务时,项目的DefaultTaskResponsible将用作任务。Responsible。但是可以更改任务.Responsible,甚至将其设置为null 因此,在“正常”编程环境中,我会使用一个任务构造函数接受项目,并在那里设置负责人: publ
项目
实体。可以为其分配任务
。项目中定义了一个DefaultTaskResponsible
。
每当创建任务时,项目的DefaultTaskResponsible
将用作任务。Responsible
。但是可以更改任务.Responsible
,甚至将其设置为null
因此,在“正常”编程环境中,我会使用一个任务
构造函数接受项目
,并在那里设置负责人
:
public class Task {
public Task(Project p) {
this.Responsible = p.DefaultTaskResponsible;
...
}
}
但是,我应该如何在具有查找视图的CRM世界中实现类似的功能呢?在Dynamics CRM(或我的自定义解决方案)中,有一个带有项目
查找字段的任务
视图。使用自定义的任务构造函数是没有意义的
也许可以在Dynamics CRM中使用业务规则,并在项目发生变化时更新负责人(不确定)?!但是我应该如何处理WebApi/OData客户机呢
如果我收到一篇到任务
端点的帖子,但没有负责人
,我希望使用默认任务负责人
,例如
POST [Organization URI]/api/data/tasks
{
"project@odata.bind":"[Organization URI]/api/data/projects(xxx-1)"
}.
未发送任何Responsible
(可能是因为它是一个较旧的客户端),因此请使用默认客户端。但是如果设置了责任
,则应使用传递的值,例如
POST [Organization URI]/api/data/tasks
{
"project@odata.bind":"[Organization URI]/api/data/projects(xxx-1)",
"responsible@odata.bind": null
}.
在我的TaskController
中,我只看到Task
模型的Responsible
为空,但我不知道它是空的,因为它是显式设置的还是因为它没有在请求中发送。
我的想法/概念有问题吗?我认为基于其他对象/属性初始化属性是很常见的,不是吗?这个问题可能超出了本论坛的讨论范围,但这是我感兴趣的主题。一些想法:
“任务”是一种通用结构,传统上可以与许多不同类型的实体相关联。例如,您可能不仅有与项目关联的任务,而且还有与客户记录和销售记录关联的任务。要使用您的代码示例运行,如下所示:
public Task(Entity parent) {}
然后,您必须决定您对责任方的违约是针对项目的,还是针对所有有任务的实体的。如果是后者,那么我们的概念如下:
public Task(ITaskEntity parent)
{
this.Responsible = parent.DefaultResponsible; //A property of ITaskEntity
}
此逻辑应在数据库“预操作”级别强制执行,即当CRM应用程序收到创建任务的请求时,它应进行此计算,然后将任务持久化到数据库。这意味着您应该有一个数据库执行管道,可以在数据库操作发生之前或之后执行操作。标准的简单执行管道如下所示:
public Task(ITaskEntity parent)
{
this.Responsible = parent.DefaultResponsible; //A property of ITaskEntity
}
验证->操作前->操作(积垢)->操作后
除非你这样做是为了好玩,否则我建议你放弃这个项目,使用现有的CRM系统。这个问题可能不在本论坛讨论范围之内,但这是我感兴趣的主题。一些想法:
“任务”是一种通用结构,传统上可以与许多不同类型的实体相关联。例如,您可能不仅有与项目关联的任务,而且还有与客户记录和销售记录关联的任务。要使用您的代码示例运行,如下所示:
public Task(Entity parent) {}
然后,您必须决定您对责任方的违约是针对项目的,还是针对所有有任务的实体的。如果是后者,那么我们的概念如下:
public Task(ITaskEntity parent)
{
this.Responsible = parent.DefaultResponsible; //A property of ITaskEntity
}
此逻辑应在数据库“预操作”级别强制执行,即当CRM应用程序收到创建任务的请求时,它应进行此计算,然后将任务持久化到数据库。这意味着您应该有一个数据库执行管道,可以在数据库操作发生之前或之后执行操作。标准的简单执行管道如下所示:
public Task(ITaskEntity parent)
{
this.Responsible = parent.DefaultResponsible; //A property of ITaskEntity
}
验证->操作前->操作(积垢)->操作后
除非你这样做是为了好玩,否则我建议放弃该项目,使用现有的CRM系统。Zach,该项目已经存在,由大约150个相当专业的实体组成。由于我的问题,我考虑迁移到一个标准的CRM解决方案,并评估动态365 / CRM。但我仍然不知道如何在这种环境中实现我的需求。也许我的设计/方法是错误的,我应该改为,例如,始终根据DefaultResponsible设置Responsible,并添加OverridedResponsible属性(类似于dynamics CRM中的OverridedEncreatedon属性)或IsResponsibleOverridden属性(类似于SalesOrderDetail上的IsPriceOverridden)?Zach,该项目已经存在,由大约150个相当专业的实体组成。由于我的问题,我考虑迁移到一个标准的CRM解决方案,并评估动态365 / CRM。但我仍然不知道如何在这种环境中实现我的需求。可能我的设计/方法是错误的,我应该改为,例如,始终根据DefaultResponsible设置Responsible,并添加OverridedResponsible属性(类似于dynamics CRM中的OverridedEncreatedOn属性)或IsResponsibleOverridden属性(类似于SalesOrderDetail上的IsPriceOverridden)?如果您正在寻找执行此操作的非编程方式,我建议在任务
实体上运行同步工作流。WF可以查找父项目
,确定其是否有责任人
,并将该值复制到任务
(如果存在)。WFs在服务器上执行并被触发(除非明确禁用)