C# 封装业务决策-如何返回它们

C# 封装业务决策-如何返回它们,c#,business-logic,C#,Business Logic,假设我们有以下要求: 用户输入一些数据 软件决定用户是否可以将数据附加到现有客户或是否需要创建新客户 然后,向用户显示客户列表或“新客户”页面 我的目标是,我不想在用户界面的ViewModels中泄露业务逻辑(=决定做什么) 考虑以下取自虚拟视图模型的示例代码: void Main() { var businessLogic = new BusinessLogic(); var request = new RequestData(); switch (busines

假设我们有以下要求:

  • 用户输入一些数据
  • 软件决定用户是否可以将数据附加到现有客户或是否需要创建新客户
  • 然后,向用户显示客户列表或“新客户”页面
我的目标是,我不想在用户界面的ViewModels中泄露业务逻辑(=决定做什么)

考虑以下取自虚拟视图模型的示例代码:

void Main()
{
    var businessLogic = new BusinessLogic();
    var request = new RequestData();

    switch (businessLogic.DecideWhatToDo(request))
    {
        case SelectCustomer select:
            Console.WriteLine("You should select one of the existing customers");
            break;

        case CreateNewCustomer createNew:
            Console.WriteLine("You should create a new customer first");
            break;

        default:
            throw new NotSupportedException();  
    }
}
这是我关于如何返回业务逻辑所做决策的第一个想法

决策逻辑对我来说非常重要,因此我明确希望将其放在一个单独的类中,并使用许多不同的测试用例对其进行单元测试


但不知怎的,我不确定开关的情况。这类问题有更好的模式吗?

这是一个非常广泛的问题,没有单一的正确答案。很多人都遵循一些常见的模式,因为它们在大多数情况下都能很好地工作——看看和。实际上我们使用的是MVVM。但我想把重点放在开关箱上。怎么用可以吗?函数可以为不同的决策返回不同的类型吗?还是有更好的模式?我明白了。对于每种情况都需要不同类型的开关块,通过多态性可能会更好。使用
Execute()
方法创建一个
IResult
接口(或任何您想要调用的接口)。然后,业务层返回一个
IResult
,视图模型不必知道它是什么,它只需调用
Execute()