我正在寻找帮助来决定我应该在哪里编写逻辑。我也想写单元测试。
我收到订单,我必须将此订单插入db。
我的订单型号:
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; }
}
从这个模型我必须检查:
我在我的项目中首先使用Repository Pattern,EF代码和IoC AutoFac和AutoMapper。我还想编写上述业务逻辑的单元测试。
我的困惑是:
我应该在逻辑上写下我的控制器 - 例如:我应该通过应用我的上述检查从控制器构建我的数据库模型,然后将其传递给订单服务,我只需保存我的模型
OR
我是否应该在业务层(订单服务)中编写上述所有检查 - 例如 - 将DTO对象从Controller传递给服务,并将所有其他检查传递到服务层?
非常感谢,
答案 0 :(得分:2)
我喜欢判断逻辑是否属于服务/域而不是控制器层的方式是,如果我构建此应用程序的胖客户端版本,是否会抛弃此逻辑。
如果我保持这种逻辑,那么它与应用程序流无关,应该封装在服务层中(当然,您还要对业务服务和域层进行单元测试)。
如果我抛弃这个逻辑,它可能属于控制器层,因为它可能与应用程序流有关(在网站与胖客户端之间存在很大差异)。
这个逻辑在第一阵营中似乎是坚定的,你会保留它,因此它应该进入你的服务或领域层。
答案 1 :(得分:0)
总的来说,我努力将所有if
- 和switch
- es放入可测试代码中,即在控制器中,并将其余的代码(视图,服务等)保存为简单/直接/琐碎。
所以我将这些支票放入控制器,除非我有充分的理由不这样做(例如尽量减少到数据库的往返)