哪里应该是我的逻辑服务层或控制器
本文关键字:服务 控制器 我的 | 更新日期: 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; }
}
从这个模型我必须检查:
- 如果SiteID在DataBase
- 如果不在DB中,从第三方API获取完整的站点信息并保存到我的DB
- 如果站点存在,只需获取详细信息
- 检查我的数据库中是否存在Customer。
- 如果不存在-从第三方API获取客户信息并保存到我的数据库
- 如果存在,只需从我的DB
- 最后,保存此订单
我在我的项目中使用存储库模式,EF代码和IoC AutoFac和AutoMapper。我还想为上面提到的业务逻辑编写单元测试。
我的困惑是:
我应该写上面的逻辑我的控制器-例如:我应该通过应用上面的检查从控制器构建我的DB模型,并简单地将它传递给Order Service,我将简单地保存我的模型
或
我是否应该在业务层(订单服务)中编写上述所有检查-例如-将DTO对象从控制器传递到服务,并在服务层中执行所有其他检查?
许多谢谢,我决定逻辑是属于服务/域还是控制器层的方式是,如果我要构建这个应用程序的厚客户端版本,我是否会抛弃这个逻辑。
如果我要保留这个逻辑,那么它与应用程序流无关,并且应该封装在服务层中(当然您需要对业务服务和域层进行单元测试)。
如果我把这个逻辑扔出去,它可能属于控制器层,因为它可能绑定到应用程序流(这在网站和厚客户端中是非常不同的)。
这个逻辑似乎坚定地属于第一个阵营,您应该保留它,因此它应该进入您的服务或域层。
一般来说,我努力将所有if
-s和switch
-es放入可测试代码中,即控制器中,并保持其余代码(视图,服务等)尽可能简单/直接/琐碎。
所以我会把这些检查到一个控制器,除非我有一个很好的理由不这样做(例如,减少往返数据库)