我有一个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
。
我的问题:
在不违反单一责任原则的情况下,我应该把
GetCustomerOrders
放在哪里?在CustomerService
、OrderService
或两者中?我的控制器中有多个服务,是否违反了单一责任原则?例如:
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 } }
我有一堆动作方法臃肿的控制器,例如我的
ProductController
有:Index Add Edit Delete Priority AddPriority EditPriority DeletePriority
如果控制器被拆分
ProductController Index Add Edit Delete ProductPriorityController Index Add Edit Delete
我看到微软的模板项目在其控制器中没有超过一个CRUD操作(见底部示例(。如果我的控制器中有多个CRUD操作,这是一个糟糕的设计吗(上例(?我本来想拆分我的控制器,但我不想它以后因为我必须维护50个控制器而咬我的屁股。
如有任何帮助,我们将不胜感激,并为糟糕的英语道歉。
- 我将把它放在customerService中,因为它取决于您传递给函数的客户
- 我认为控制器的最大服务大约是一个控制器中的3/4服务。所以在你的情况下,我认为这很好
- 控制器不需要实现您的业务逻辑。他们只需要获取数据并将其发布到正确的位置。我认为您应该创建一个管理器/服务/类来处理业务逻辑。关于您的CRUD操作,它应该在一个控制器中(get/post等(
1-您并不总是需要通过服务来访问控制器中的存储库。
例如,您可以采用洋葱架构,而不是3层架构。就我个人而言,我认为以正确的方式访问层的概念很重要,但添加间接级别只是为了调用服务中没有逻辑的存储库,这会让我质疑服务的价值,因为在这种情况下,服务提供的服务是什么?由于存储库知道域,因此可以返回域对象。
命令和查询呢?
你可以多读一点,把这一切作为你的偏好,或者调整一个想法。只要始终牢记分离关注点的想法,你就走在了好的道路上。
关于问题2和3,我同意@Rik的观点,但我会粘贴他的答案,只是为了让我的答案完整(归功于他(
2-不,没关系。事实上,您正在将不同的职责划分为不同的服务,这是非常"单一的职责">
3-如果他们做不同的事情,我会说把他们分开。如果你知道哪个控制器负责什么,那么维护多个控制器就很容易了。
-
我建议做一个
CustomerOrdersController
。 -
不,没关系。事实上,您将不同的职责划分为不同的服务,这是非常"单一的职责"。
- 我想说,如果他们做不同的事情,就把他们分开。如果你知道哪个控制器负责什么,那么维护多个控制器就很容易了