Предупреждения о бизнес-объектах: хорошие примеры/идеи?

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

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

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

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

  • Deleting "Company A" will put 10,000 workers on the streets.
    • Would you like to find new work for these employees? 'Click Here'

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

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

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

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

Есть ли у кого-нибудь передовой опыт, примеры или предложения по реализации такой системы предупреждений? Больше всего меня беспокоит № 2. Будет множество различных предупреждающих сообщений, поэтому я не хочу просто возвращать say... a Dictionary, где int является идентификатором типа предупреждения. С этим будет трудно быстро справиться.

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


person Ocelot20    schedule 15.10.2010    source источник
comment
очень трудно заставить людей прочитать какое-либо сообщение, если им не нужна информация   -  person rerun    schedule 15.10.2010
comment
У меня такое ощущение, что, что бы ни случилось, вам понадобится какой-то список всех возможных типов предупреждений... он вам все равно понадобится, чтобы определить действие, которое должно быть выполнено в зависимости от типа предупреждения, не так ли? считать ?   -  person tsimbalar    schedule 15.10.2010
comment
@tsimbalar: Определенно верно, но я пытаюсь найти хороший способ организовать все эти определенные типы предупреждений без гигантского перечисления, содержащего их все.   -  person Ocelot20    schedule 15.10.2010


Ответы (4)


Я предполагаю, что возможные типы предупреждений будут весьма ограничены... Может быть, 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, подобный этому

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

Это просто идея на скорую руку...

person tsimbalar    schedule 15.10.2010
comment
Я думал об использовании Enums, но количество предупреждений на самом деле будет довольно большим. Тем не менее, ограничение типов предупреждений классом, к которому они относятся, является хорошей идеей. Пока голосую за, приму позже, если не появятся лучшие идеи. - person Ocelot20; 15.10.2010
comment
@ Ocelot20 Ocelot20: да, на самом деле я слишком поздно увидел ограничение о большом количестве предупреждений, когда перечитывал вопрос после публикации ответа ... Однако меня интересуют предложенные ответы! :-) - person tsimbalar; 15.10.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.

person Martin Liversage    schedule 15.10.2010

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

MacX

person MacX    schedule 15.10.2010
comment
Можете ли вы объяснить немного подробнее? Предупреждения очень сильно зависят от бизнес-объекта, потому что именно новые/измененные свойства объекта определяют появление предупреждений. - person Ocelot20; 15.10.2010
comment
Упомянутые вами изменения внесены в пользовательский интерфейс. ИМХО, пользовательский интерфейс отвечает за доставку достоверных данных на другой уровень (бизнес-уровень). - person MacX; 19.01.2011

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

person Dismissile    schedule 15.10.2010