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

4
我正在尝试为我正在工作的项目中的业务对象想出一个可重用的警告机制。在保存我们的某些业务对象之前,有时我们需要警告用户可能会产生的影响。比如说我的业务对象名为“公司”。Company.Delete()将删除该公司,并不关心发生了什么。这个特定的公司可能有10,000名员工,如果意外地把他们辞退了,他们会感到非常失望...
因此,界面需要一种方式来查看类似以下的内容:
- 删除“公司A”将使10,000名工人失业。 - 删除“公司A”将使1,000,000股东持有无用的股票。
所以我可以创建一个像Company.GetWarnings()这样的函数,返回一些字符串以供显示,但我希望有更好的方法。如果Company.GetWarnings()返回了上面的第一个警告,则我希望界面能够知道这个警告的含义。例如,如果第一个警告出现了,界面将知道它的含义,并通过提供一个链接来处理这种情况,例如:
- 删除“公司A”将使10,000名工人失业。 - 您是否想为这些员工寻找新的工作?'点击这里'
或者另一个业务对象可能会使用Company.GetWarnings(),并且知道一些工人将被辞退,它可以自动发送解雇补偿金。你明白我的意思...
因此,我想这个要求听起来很容易,但我在细节上有点迷失了。主要是,我可以给GetWarnings()什么样的结构,以便它返回:
- 警告消息。 - 一些标识它是什么类型的消息的方式。
让我来问一个问题:
有没有人有任何最佳实践、示例或建议来实现这种警告系统?我主要关注第2点。将会有大量不同类型的警告消息,所以我不想只返回比如说...一个字典,其中int是警告类型的ID。那样会很快变得难以管理。
感谢您能提供的任何建议。

1
除非信息对他们有用,否则很难让人们阅读任何信息。 - rerun
我有一种感觉,无论发生什么事情,你都需要列出所有可能的“警告类型”清单……无论如何,你都需要它来根据警告类型确定要执行的操作,不是吗? - tsimbalar
@tsimbalar: 绝对正确,但我正在尝试找到一种好的方法来组织所有这些定义的警告类型,而不必使用包含它们所有的巨大枚举。 - Ocelot20
4个回答

2

我想警告可能的类型会非常有限...也许使用枚举是个好主意?

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

你可以定义一个小类(实际上可以是一个通用的Warning<T>,其中T可以是Company或其他内容),并跟踪错误的来源。
public class Warning<T>{
    public Warning(WarningType type, String msg, T source){
         //you get the idea */  
    }
}

然后您的验证程序将生成类似以下内容的警告列表

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

这只是一个快速的想法...


我在考虑使用枚举,但警告的数量实际上会相当大。不过将警告类型限制在它们所属的类中是个好主意。暂时点赞,如果没有更好的想法,稍后会接受。 - Ocelot20
@Ocelot20:是的,事实上我在回答后重新阅读问题时才看到有关警告数量的限制,有点晚了...不过我对提出的答案很感兴趣! :-) - tsimbalar

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.


1

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

MacX


你能详细解释一下吗?警告信息很大程度上取决于业务对象,因为对象的新/更改属性驱动了出现哪些警告。 - Ocelot20
你提到的变更是在用户界面(UI)中进行的。在我看来,UI应该负责向其他层(业务层)传递有效的数据。 - MacX

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接