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

时间:2015-10-27 01:13:14

标签: c# asp.net-mvc entity-framework unit-testing architecture

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

我收到订单,我必须将此订单插入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; }
}

从这个模型我必须检查:

  1. 如果SiteID在DataBase中
  2. 如果不在DB中,请从第三方API获取完整的网站信息并保存到我的数据库
  3. IF网站存在,只需获取详细信息
  4. 检查我的数据库中是否存在客户。
  5. 如果不存在 - 从第三方API获取客户信息并保存到我的数据库
  6. 如果存在,只需从我的数据库中获取
  7. 最后,保存此订单
  8. 我在我的项目中首先使用Repository Pattern,EF代码和IoC AutoFac和AutoMapper。我还想编写上述业务逻辑的单元测试。

    我的困惑是:

    我应该在逻辑上写下我的控制器 - 例如:我应该通过应用我的上述检查从控制器构建我的数据库模型,然后将其传递给订单服务,我只需保存我的模型

    OR

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

    非常感谢,

2 个答案:

答案 0 :(得分:2)

我喜欢判断逻辑是否属于服务/域而不是控制器层的方式是,如果我构建此应用程序的胖客户端版本,是否会抛弃此逻辑。

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

如果我抛弃这个逻辑,它可能属于控制器层,因为它可能与应用程序流有关(在网站与胖客户端之间存在很大差异)。

这个逻辑在第一阵营中似乎是坚定的,你会保留它,因此它应该进入你的服务或领域层。

答案 1 :(得分:0)

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

所以我将这些支票放入控制器,除非我有充分的理由不这样做(例如尽量减少到数据库的往返)