业务对象“警告”:好的例子/想法?

时间:2010-10-15 14:16:49

标签: c# design-patterns business-objects

我正在尝试为我正在处理的项目中的业务对象提供可重用的警告部分。在保存我们的业务对象之前,有时我们需要警告用户潜在的影响。假设我的业务对象名为“公司”。 Company.Delete()将摆脱公司而不是真正关心会发生什么。那个特定公司可能有10,000名员工,如果很容易让他们意外地失业,那将会非常失望......

因此用户界面需要一种方法来查看:

  • 删除“A公司”将使10,000名工人上街。
  • 删除“A公司”将使1,000,000名股东留下无用的股票。

所以我可以创建一个类似于Company.GetWarnings()的函数来返回要显示的字符串,但我想要比这更好的东西。如果Company.GetWarnings()返回上面的第一个警告,我希望UI能够知道该警告的含义。例如,如果出现第一个警告,UI将知道它的含义并通过提供如下链接来处理这种情况:

  • 删除“A公司”将使10,000名工人上街。
    • 您想为这些员工找到新工作吗? '点击这里'

或许另一个业务对象可能会使用Company.GetWarnings(),并且知道某些工作人员会被解雇,它可能会自动发送遣散费。你明白了......

所以我觉得这个要求听起来很简单,但是我会在细节方面迷失方向。主要是,我可以为GetWarnings()提供什么样的结构,以便它返回:

  1. 警告信息。
  2. 识别它是什么类型的消息的某种方式。
  3. 离开我的问题:

    是否有人有任何最佳做法,示例或建议来实施此类警告系统?我主要担心的是#2。会有大量不同类型的警告消息,所以我不想只返回说...一个字典,其中int是警告类型的Id。这很难快速管理。

    感谢您提供任何建议。

4 个答案:

答案 0 :(得分:2)

我猜可能的警告类型会非常有限......也许Enum会是一个好主意吗?

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

您可以定义一个小类(实际上它可以是通用Warning<T>TCompany或其他内容,您可以跟踪错误的来源。< / p>

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

然后您的验证会生成Warning这样的列表

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

这只是一个简单的想法...

答案 1 :(得分:2)

您可以使用多态来定义抽象警告和具体警告的层次结构:

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 :(得分:1)

嘿Ocelot, 在我看来,这不是数据驱动的问题,也不依赖于业务对象本身。您需要某种ActionValidator来检查业务逻辑并负责这些检查。

的MacX

答案 3 :(得分:0)

如果您能够使用第三方框架......我建议您使用CSLA.net。这是一个非常好的业务逻辑框架。如果您不能将它用于此项目,您至少可以查看源代码以了解他如何在业务规则中执行警告。源代码是免费提供的。