2015-10-27 71 views
0

我在寻找帮助,以决定我应该在哪里写我的逻辑。我也想编写单元测试。哪里应该是我的逻辑服务层或控制器

我得到一个订单,我必须将此订单插入到数据库中。

我的订货型号:

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是数据库
  2. 如果不是在数据库,获取第三方完整的网站信息API并保存到我的数据库中
  3. 如果网站存在,只需获取详细信息
  4. 检查客户是否存在我的数据库。
  5. 如果NOT EXISTS - 获得来自第三方API的客户信息,并保存到我的数据库
  6. 如果存在,就从我的DB
  7. 终于搞定,它保存该订单

我使用存储库模式,EF代码优先和我的项目中的IoC AutoFac和AutoMapper。我也想写上述商业逻辑的单元测试。

我的困惑是:

我应该写上面的逻辑我的控制器 - 例如:我应该将我的上述检查建立从控制器我的DB模式,简单地把它传递给订购服务,我会简单地救我模型

OR

我应该写在业务层(订购服务),以上所有的检查 - 例如 - 从控制器传递DTO对象的服务和业务层中的所有其他检查?

非常感谢,

回答

0

总的来说,我努力把所有if -s和switch -es到测试的代码,即控制器,并保留其余的代码(视图,服务等)尽可能简单/直接/微不足道。

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

+0

Ivan - 谢谢你的回复。我的理解是,即使我的代码需要ifs和开关。如果不这样做,我无法正确插入订单。如果我必须从另一个地方访问这个逻辑,我将不得不重写它 - 特别是,如果有另一个地方接收除我的控制器以外的新订单,我不希望任何人触摸“插入新订单”逻辑。我希望这次我更明确地要求我的要求。你现在有什么想法? – jNet

+1

那么可能你需要一个OrderManager来从你的控制器和其他地方使用。 您可以向OrderManager注入其依赖关系(ICustomerRepository,ICustomerThirdPartyApi,IOrderRepository等) 并单元测试它。 –

2

我想,以决定是否逻辑在服务/域VS所属的方法控制器层是我是否会抛弃这个逻辑,如果我正在构建这个应用程序的胖客户端版本。如果我保留这个逻辑,那么它与应用程序流无关,应该封装在一个服务层(当然,你单元测试你的业务服务和域层)。

如果我将这种逻辑抛出,它可能属于控制器层,因为它可能与应用程序流(这在网站和胖客户端中有很大不同)。

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

+0

罗布 - 感谢您的回复。你能否再次重申你的意见。例如:扔掉这个逻辑的确切含义是什么? – jNet

+0

如果您正在编写此应用程序的新UI,你能够重新使用你正在编写的代码吗?如果不是,则这是您将删除(扔掉)的逻辑,因为新应用程序将具有不同的控制器逻辑。 –

相关问题