Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在(Dynamics)CRM中初始化构造函数中属性的替代方法_C#_Oop_Dynamics Crm_Crm - Fatal编程技术网

C# 在(Dynamics)CRM中初始化构造函数中属性的替代方法

C# 在(Dynamics)CRM中初始化构造函数中属性的替代方法,c#,oop,dynamics-crm,crm,C#,Oop,Dynamics Crm,Crm,我目前正在开发一个定制CRM风格的解决方案(EF/Winforms/OData WebApi),我想知道如何实现一个非常简单的需求: 假设有一个简单的项目实体。可以为其分配任务。项目中定义了一个DefaultTaskResponsible。每当创建任务时,项目的DefaultTaskResponsible将用作任务。Responsible。但是可以更改任务.Responsible,甚至将其设置为null 因此,在“正常”编程环境中,我会使用一个任务构造函数接受项目,并在那里设置负责人: publ

我目前正在开发一个定制CRM风格的解决方案(EF/Winforms/OData WebApi),我想知道如何实现一个非常简单的需求:

假设有一个简单的
项目
实体。可以为其分配
任务
项目中定义了一个
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在服务器上执行并被触发(除非明确禁用)