MVC中的单一责任原则

时间:2015-07-05 16:08:30

标签: c# asp.net-mvc entity-framework design-patterns single-responsibility-principle

我有一个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. 我有一堆带有臃肿Action方法的控制器,例如我的ProductController有:

     Index
     Add
     Edit
     Delete
     Priority
     AddPriority
     EditPriority
     DeletePriority
    

    如果控制器被拆分

     ProductController
           Index
           Add
           Edit
           Delete
     ProductPriorityController
           Index
           Add
           Edit
           Delete
    

    我看到微软的模板项目在他们的控制器内没有多个CRUD操作(对于底部示例)。如果我的控制器内有多个CRUD操作(顶部示例),这是一个糟糕的设计吗?我想拆分我的控制器,但我不想让它在以后因为必须维护50个控制器而咬我的屁股。

  4. 任何帮助都会受到赞赏并为糟糕的英语道歉。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  1. 我建议制作CustomerOrdersController

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

  3. 如果他们分开的话,我会说让他们分开。如果您知道哪个控制器负责什么,那么维护许多控制器很容易。

答案 2 :(得分:0)

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

您可以拥抱onion architecture,例如3层架构。我个人认为重要的是以正确的方式访问图层的概念,但添加间接级别只是为了调用服务器内部没有逻辑的存储库,让我质疑服务的价值,因为在那种情况下,什么是服务该服务是提供? 由于您的存储库知道域,因此您可以返回域对象。

commands and queries怎么办?

您可以阅读更多内容,并将您的所有这些视为您的偏好,或者可以调整一个想法。只要记住关注点分离的想法,你就是好方法。

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

2-不,那没关系。事实上,您正在将不同的职责划分为单独的服务,这是非常单一的责任&#34;

3-我说如果他们分开的话就把它们分开。如果您知道哪个控制器负责什么,那么维护许多控制器很容易。