Бизнес-объект «Предупреждения»: хорошие примеры / идеи? - PullRequest
4 голосов
/ 15 октября 2010

Я пытаюсь придумать многоразовое предупреждение для бизнес-объектов в проекте, над которым я работаю. Прежде чем сохранить один из наших бизнес-объектов, иногда нам нужно предупредить пользователя о возможных последствиях. Скажем, мой бизнес-объект был назван «Компания». Company.Delete () избавится от компании и не особо заботится о том, что происходит. В этой конкретной компании может быть 10 000 сотрудников, которые были бы весьма разочарованы, если бы их было так легко уволить с работы случайно ...

Таким образом, для пользовательского интерфейса требуется способ увидеть что-то вроде:

  • Удаление «Компании А» выведет 10 000 рабочих на улицы.
  • Удаление «Компании А» оставит 1 000 000 акционеров бесполезными.

Так что я мог бы просто создать такую ​​функцию, как Company.GetWarnings (), которая возвращает некоторые строки для отображения, но я хочу что-то немного лучше, чем это. Если Company.GetWarnings () вернула первое предупреждение выше, я бы хотел, чтобы пользовательский интерфейс мог знать, что означает это предупреждение. Например, если появилось первое предупреждение, пользовательский интерфейс знал бы, что это значит, и обрабатывал ситуацию, предоставляя ссылку, например:

  • Удаление «Компании А» выведет 10 000 рабочих на улицы.
    • Хотели бы вы найти новую работу для этих сотрудников? «Нажмите здесь»

Или, возможно, другой бизнес-объект будет использовать Company.GetWarnings () и, зная, что некоторые работники будут уволены с работы, он может автоматически отправлять выходные пакеты. Вы поняли ...

Так что, я думаю, требование звучит довольно просто, но я немного теряюсь в мелких деталях. Главным образом, какую структуру я мог бы дать GetWarnings (), чтобы он возвращал:

  1. Предупреждающее сообщение.
  2. Какой-то способ определить, что это за сообщение.

Оставив меня на мой вопрос:

Есть ли у кого-нибудь лучшие практики, примеры или предложения по внедрению такого рода системы предупреждений? Моя главная проблема с # 2. Там будет множество разных видов предупреждающих сообщений, поэтому я не хочу просто возвращать скажем ... словарь, где int - это идентификатор типа предупреждения. Это было бы трудно справиться быстро.

Спасибо за любой совет, который вы можете дать.

Ответы [ 4 ]

2 голосов
/ 15 октября 2010

Вы можете использовать полиморфизм для определения абстрактного предупреждения и иерархии конкретных предупреждений:

abstract class Warning {
  public String Description { get; protected set; }
  public abstract IEnumerable<Consequence> Consequences { get; }
  public abstract IEnumerable<Action> Actions { get; }
}

class CompanyDeletionWarning : Warning {
  public override IEnumerable<Consequence> Consequences { get { ... } }
  public override IEnumerable<Action> Actions { get { ... } }
}

Задача состоит в том, чтобы создать абстрактный базовый класс, достаточно общий для обработки всех возможных предупреждений, которые выиметь.Возможно, вам также придется использовать этот подход в агрегированных объектах, например, Action может быть абстрактным базовым классом с методом Execute.Затем вы можете создать конкретный FindNewWorkForEmployeesAction.

. Если вы предпочитаете, вы можете вместо этого использовать интерфейсы, например, IWarning.

.
2 голосов
/ 15 октября 2010

Я думаю, что возможные типы предупреждений были бы весьма ограничены ... Может быть, Enum было бы хорошей идеей?

enum WarningType{
    MayPutWorkersOnTheStreet,
    WillNotPleaseStakeholders
    /*...*/
}

Вы можете определить небольшой класс (фактически это может быть общий Warning<T>, T, являющийся Company или что-то еще, и вы можете отслеживать источник ошибки.

public class Warning<T>{
    public Warning(WarningType type, String msg, T source){
         //you get the idea */  
    }
}

И тогда ваша проверка выдаст список Warning s, подобных этому

public IEnumerable<Warning<Company>> GetWarnings(){
   // something here
}

Это просто быстрая идея ...

1 голос
/ 15 октября 2010

Эй, Оцелот, по моему мнению, это не связано с данными и не относится к самому бизнес-объекту.Вам нужен какой-то ActionValidator, который проверяет бизнес-логику и заботится об этих проверках.

MacX

0 голосов
/ 15 октября 2010

Если вы можете использовать сторонние фреймворки ... Я бы рекомендовал использовать CSLA.net.Это очень хорошая основа для бизнес-логики.Если вы не можете использовать его для этого проекта, вы можете хотя бы взглянуть на исходный код, чтобы увидеть, как он делает предупреждения в бизнес-правилах.Исходный код предоставляется бесплатно.

...