我有一个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
}
}
我有一堆带有臃肿Action方法的控制器,例如我的ProductController
有:
Index
Add
Edit
Delete
Priority
AddPriority
EditPriority
DeletePriority
如果控制器被拆分
ProductController
Index
Add
Edit
Delete
ProductPriorityController
Index
Add
Edit
Delete
我看到微软的模板项目在他们的控制器内没有多个CRUD操作(对于底部示例)。如果我的控制器内有多个CRUD操作(顶部示例),这是一个糟糕的设计吗?我想拆分我的控制器,但我不想让它在以后因为必须维护50个控制器而咬我的屁股。
任何帮助都会受到赞赏并为糟糕的英语道歉。
答案 0 :(得分:0)
答案 1 :(得分:0)
我建议制作CustomerOrdersController
。
不,没关系。事实上,您将不同的职责划分为单独的服务,这是非常“单一的责任”。
答案 2 :(得分:0)
1-您并不总是需要通过服务来访问控制器中的存储库。
您可以拥抱onion architecture,例如3层架构。我个人认为重要的是以正确的方式访问图层的概念,但添加间接级别只是为了调用服务器内部没有逻辑的存储库,让我质疑服务的价值,因为在那种情况下,什么是服务该服务是提供? 由于您的存储库知道域,因此您可以返回域对象。
您可以阅读更多内容,并将您的所有这些视为您的偏好,或者可以调整一个想法。只要记住关注点分离的想法,你就是好方法。
关于问题2和3我同意@Rik,但我会粘贴他的答案只是为了让我的答案完整(相信他)
2-不,那没关系。事实上,您正在将不同的职责划分为单独的服务,这是非常单一的责任&#34;
3-我说如果他们分开的话就把它们分开。如果您知道哪个控制器负责什么,那么维护许多控制器很容易。