c# - 服务层应该保留任何状态吗?或者仅通过构造函数/ setter 注入(inject)?

标签 c# java asp.net-mvc

我有一个在 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/

相关文章:

c# - 如何基于决策树实现c#代码/逻辑?

c# - 调用继承方法和基方法

c# - 更改目标框架后 Windows 服务不会启动

java - Spring Boot Hibernate、CriteriaBuilder

javascript - 我可以通过ajax访问不同位置的同名 Controller 吗?

c# - VB6 到 C# : Hash Sign For Converting to Double

java - Netbeans 无法识别 JAR 库

Java Spring 将消息从消费者发送回队列

asp.net-mvc - MapMvcAttributeRoutes:在应用程序的启动前初始化阶段不能调用此方法

javascript - .Net MVC 将 ViewBag 值分配给 JavaScript 脚本变量问题