我有一个在 Controller 中使用的 OrderService。
我所做的只是从自定义 Controller 继承,我在其中添加了 OrderService 作为属性。我在 OnActionExecuting 事件中初始化 OrderService。
初始化 OrderService 时,我设置了 Order 属性。
这是因为 OrderService 对 Order 执行操作,因此设置一次就有意义,而不必将 Order 传递到每个方法中。
此设计是否遵循良好实践?
public class MyController : Controller
{
public OrderService OrderService {get; set;}
protected override void OnActionExecuting(...)
{
OrderService = new OrderService(getOrderIdFromCookie());
}
}
public class OrderService
{
private Order _order;
public OrderService(int orderId)
{
_order = Dao.GetOrderById(orderId);
}
public void AddProduct(Product product)
{
product.OrderId = _order.Id; // assumes order is loaded
ProductDao.Add(product);
}
}
这实际上是一个独立于语言的问题,根据我的理解,服务不应该真正保持任何类型的任何状态。
我相信服务层类应该是单例,对吗? (当使用依赖注入(inject)进行设置时)。
这些方法不应假定 Order 对象具有状态。
如果是这样的话,那么我的设计就不正确吧?
最佳答案
服务层不应该是单例。
它也不应该包括对象状态。
服务层应该能够对其类型的任何实例进行操作,而不是存储单个实例......这导致必须创建服务的多个实例才能处理多个订单。例如:
public interface IOrderService
{
public void AddProduct(Order order, Product product);
}
public class DaoOrderService : IOrderService
{
public Order GetOrder(orderId)
{
return Dao.GetOrderById(orderId);
}
public void AddProduct(Order order, Product product)
{
// The way this method works seems like it should be in a ProductService
// rather than in the OrderService.
product.OrderId = _order.Id;
ProductDao.Add(product);
}
}
然后你的 Controller 会有类似的内容:
public class MyController : Controller
{
public IOrderService OrderService { get; private set; }
public MyController(IOrderService orderService)
{
OrderService = orderService ?? new DaoOrderService();
}
public MyController()
: this(null)
{ }
protected override void OnActionExecuting(...)
{
Order myOrder = OrderService.GetOrder(orderId);
// Some stuff here
orderService.AddProduct(myOrder, selectedProduct);
}
}
关于c# - 服务层应该保留任何状态吗?或者仅通过构造函数/ setter 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051198/