MVC中的单一责任原则



我有一个MVC项目,具有以下模式

View <-> Controller <-> Service <-> Repository/Entities <-> Database

例如,如果我的数据库中有2个表(Customer和Order(,那么我的Repository层中有2类(这个类与我的数据库表1:1映射,因为我使用的是EF Code First(:

public class Customer
{
     [Key]
     public int CustomerID { get; set; }
     public int Name { get; set; }
     //rest of columns here
}
public class Order
{
     [Key]
     public int OrderId { get; set; }
     //rest of columns here
}

然后我有服务:

public class CustomerService : ICustomerService
{
     void AddNewCustomer(Customer obj);
     void GetCustomerOrders(Customer obj);
     //rest of methods here
}
public class OrderService : IOrderService
{
     void GetOrderById(int id);
     void GetCustomerOrders(Customer obj);
     //rest of methods here
}

你可能注意到我有GetCustomerOrders

我的问题:

  1. 在不违反单一责任原则的情况下,我应该把GetCustomerOrders放在哪里?在CustomerServiceOrderService或两者中?

  2. 我的控制器中有多个服务,是否违反了单一责任原则?例如:

     public class TransactionController : Controller
     {
          //more than 1 service inside this class
          private ICustomerService _customerService;
          private IOrderService _orderService;
          public ProjectController()
          {
              this._customerService = new CustomerService();
              this._orderService = new OrderService();
          }
          public ProjectController(CustomerService customerService, OrderService orderService)
          {
              this._customerService = customerService;
              this._orderService = orderService;
          }
          public ActionResult Index()
          {
               Return View();
          }
          public ActionResult CreateCustomer()
          {
               //rest of code here
          }
          public ActionResult CreateOrder()
          {
               //rest of code here
          }
     }
    
  3. 我有一堆动作方法臃肿的控制器,例如我的ProductController有:

     Index
     Add
     Edit
     Delete
     Priority
     AddPriority
     EditPriority
     DeletePriority
    

    如果控制器被拆分

     ProductController
           Index
           Add
           Edit
           Delete
     ProductPriorityController
           Index
           Add
           Edit
           Delete
    

    我看到微软的模板项目在其控制器中没有超过一个CRUD操作(见底部示例(。如果我的控制器中有多个CRUD操作,这是一个糟糕的设计吗(上例(?我本来想拆分我的控制器,但我不想它以后因为我必须维护50个控制器而咬我的屁股。

如有任何帮助,我们将不胜感激,并为糟糕的英语道歉。

  1. 我将把它放在customerService中,因为它取决于您传递给函数的客户
  2. 我认为控制器的最大服务大约是一个控制器中的3/4服务。所以在你的情况下,我认为这很好
  3. 控制器不需要实现您的业务逻辑。他们只需要获取数据并将其发布到正确的位置。我认为您应该创建一个管理器/服务/类来处理业务逻辑。关于您的CRUD操作,它应该在一个控制器中(get/post等(

1-您并不总是需要通过服务来访问控制器中的存储库。

例如,您可以采用洋葱架构,而不是3层架构。就我个人而言,我认为以正确的方式访问层的概念很重要,但添加间接级别只是为了调用服务中没有逻辑的存储库,这会让我质疑服务的价值,因为在这种情况下,服务提供的服务是什么?由于存储库知道域,因此可以返回域对象。

命令和查询呢?

你可以多读一点,把这一切作为你的偏好,或者调整一个想法。只要始终牢记分离关注点的想法,你就走在了好的道路上。

关于问题2和3,我同意@Rik的观点,但我会粘贴他的答案,只是为了让我的答案完整(归功于他(

2-不,没关系。事实上,您正在将不同的职责划分为不同的服务,这是非常"单一的职责">

3-如果他们做不同的事情,我会说把他们分开。如果你知道哪个控制器负责什么,那么维护多个控制器就很容易了。

  1. 我建议做一个CustomerOrdersController

  2. 不,没关系。事实上,您将不同的职责划分为不同的服务,这是非常"单一的职责"。

  3. 我想说,如果他们做不同的事情,就把他们分开。如果你知道哪个控制器负责什么,那么维护多个控制器就很容易了

相关内容

  • 没有找到相关文章

最新更新