gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:38:17 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com