哪里应该是我的逻辑服务层或控制器

本文关键字:服务 控制器 我的 | 更新日期: 2023-09-27 18:19:17

我正在寻找帮助,决定我应该在哪里写我的逻辑。我也想写单元测试。

我得到一个订单,我必须把这个订单插入数据库。

my Order model:

public class CustomerView
{
    public int id { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
    public string email { get; set; }
    public string primary_email_address { get; set; }
    public string image { get; set; }
}
public class ProductView
{
    public int id { get; set; }
    public string name { get; set; }
}
public class LineView
{
    public int number { get; set; }
    public ProductView product { get; set; }
    public int quantity { get; set; }
    public double? price_variation { get; set; }
    public List<int?> modifiers { get; set; }
    public string notes { get; set; }
    public double unit_price { get; set; }
    public double unit_tax { get; set; }
}
public class MethodView 
{
    public int id { get; set; }
    public string name { get; set; }
}
public class PaymentView
{
    public int id { get; set; }
    public int number { get; set; }
    public MethodView method { get; set; }
    public double amount { get; set; }
    public double tip { get; set; }
    public string created_at { get; set; }
}
public class Order
{
    public int id { get; set; }
    public string sale_number { get; set; }
    public string status { get; set; }
    public string notes { get; set; }
    public double total { get; set; }
    public double paid { get; set; }
    public double tips { get; set; }
    public int register_id { get; set; }
    public int site_id { get; set; }
    public List<LineView> lines { get; set; }
    public double price_variation { get; set; }
    public List<PaymentView> payments { get; set; }
    public string callback_uri { get; set; }
//    public List<string> @lock { get; set; }
    public int staff_member_id { get; set; }
    public string placed_at { get; set; }
    public string fulfil_at { get; set; }
    public string created_at { get; set; }
    public string updated_at { get; set; }

    public CustomerView Customer { get; set; }
}

从这个模型我必须检查:

  1. 如果SiteID在DataBase
  2. 如果不在DB中,从第三方API获取完整的站点信息并保存到我的DB
  3. 如果站点存在,只需获取详细信息
  4. 检查我的数据库中是否存在Customer。
  5. 如果不存在-从第三方API获取客户信息并保存到我的数据库
  6. 如果存在,只需从我的DB
  7. 最后,保存此订单

我在我的项目中使用存储库模式,EF代码和IoC AutoFac和AutoMapper。我还想为上面提到的业务逻辑编写单元测试。

我的困惑是:

我应该写上面的逻辑我的控制器-例如:我应该通过应用上面的检查从控制器构建我的DB模型,并简单地将它传递给Order Service,我将简单地保存我的模型

我是否应该在业务层(订单服务)中编写上述所有检查-例如-将DTO对象从控制器传递到服务,并在服务层中执行所有其他检查?

许多谢谢,

哪里应该是我的逻辑服务层或控制器

我决定逻辑是属于服务/域还是控制器层的方式是,如果我要构建这个应用程序的厚客户端版本,我是否会抛弃这个逻辑。

如果我要保留这个逻辑,那么它与应用程序流无关,并且应该封装在服务层中(当然您需要对业务服务和域层进行单元测试)。

如果我把这个逻辑扔出去,它可能属于控制器层,因为它可能绑定到应用程序流(这在网站和厚客户端中是非常不同的)。

这个逻辑似乎坚定地属于第一个阵营,您应该保留它,因此它应该进入您的服务或域层。

一般来说,我努力将所有if -s和switch -es放入可测试代码中,即控制器中,并保持其余代码(视图,服务等)尽可能简单/直接/琐碎。

所以我会把这些检查到一个控制器,除非我有一个很好的理由不这样做(例如,减少往返数据库)