Альтернатива для инициализации свойств в конструкторе в (Dynamics) CRM - PullRequest
1 голос
/ 06 июня 2019

В настоящее время я работаю над одним из пользовательских решений в стиле CRM (EF / Winforms / OData WebApi), и мне интересно, как реализовать довольно простое требование:

Допустим, существует простая Project сущность. На него можно назначить Tasks. В Project. определено DefaultTaskResponsible. При создании Task в качестве Task.Responsible используется Project DefaultTaskResponsible. Но возможно изменить Task.Responsible и даже установить его на ноль.

Итак, в «нормальном» мире программирования я бы использовал конструктор Task, принимающий Project, и установил там Responsible:

public class Task {
  public Task(Project p) {
    this.Responsible = p.DefaultTaskResponsible;
    ...
  }
}

Но как мне реализовать нечто подобное в мире CRM с представлениями Lookup? В Dynamics CRM (или в моем собственном решении) есть представление Task с полем поиска Project. Не имеет смысла использовать пользовательский конструктор Task.

Может быть, есть возможность использовать бизнес-правила в Dynamics CRM и обновлять Ответственный при каждом изменении проекта (не уверен) ?! Но как мне работать с клиентом WebApi / OData?

Если я получаю сообщение на конечную точку Task без Responsible, я хотел бы использовать DefaultTaskResponsible, например.

POST [Organization URI]/api/data/tasks
{  
 "project@odata.bind":"[Organization URI]/api/data/projects(xxx-1)"
}.

Нет Responsible было отправлено (возможно, потому что это более старый клиент), поэтому используйте по умолчанию. Но если установлено Responsible, вместо него следует использовать переданное значение, например,

POST [Organization URI]/api/data/tasks
{  
 "project@odata.bind":"[Organization URI]/api/data/projects(xxx-1)",
 "responsible@odata.bind": null
}.

В моем TaskController я вижу только модель Task с Responsible равной нулю, но я не знаю, является ли она нулевой, потому что она была задана явно или не была отправлена ​​в запросе. Что-то не так с моими идеями / концепциями? Я думаю, что довольно часто инициализировать свойства, основанные на других объектах / свойствах, не так ли?

1 Ответ

0 голосов
/ 06 июня 2019

Этот вопрос, вероятно, выходит за рамки данного форума, но это тема, которая меня интересует. Несколько мыслей:

«Задача» - это общая конструкция, которая традиционно может быть связана со многими различными типами объектов. Например, у вас могут быть задачи не только с проектами, но и с записями клиентов и продаж. Для запуска с вашим примером кода это будет выглядеть так:

public Task(Entity parent) {}

Затем вы должны решить, является ли ваш дефолт Ответственной стороны специфичным для Проектов или общим для всех Сущностей, имеющих Задачи. Если последнее, то наша концепция выглядит так:

public Task(ITaskEntity parent) 
{
     this.Responsible = parent.DefaultResponsible; //A property of ITaskEntity
}

Эту логику следует применять на уровне «до операции» базы данных, т. Е. Когда ваше приложение CRM получает запрос на создание задачи, оно должно выполнить этот расчет и затем сохранить задачу в базе данных. Это говорит о том, что у вас должен быть конвейер выполнения базы данных, где действия могут выполняться до или после выполнения операций с базой данных. Стандартный простой конвейер выполнения выглядит так:

Проверка -> Предоперация -> Операция (CRUD) -> Постоперация

Если вы не делаете это для развлечения, я рекомендую отказаться от проекта и использовать существующую систему CRM.

...