c# Web API运行时数据与依赖注入



如果我有一个依赖于通过运行时获得的数据的服务,那么将其注入类的最佳方法是什么?

我有一个Order类:
class Order {
string OrderID { get; set; }
string CustomerName { get; set; }
...
}

我想从数据库中封装很多逻辑,所以我有一个服务:

class OrderService {
private readonly IOrderRepository _orderRepository;
private readonly IOrder _order;
public OrderService(IOrderRepository orderRepository, IOrder order) {
_orderRepository = orderRepository;
_order = order;
}
// some methods that compile data from the repository
public bool CheckAlreadyExists() { ... }
public string GetLatestShippingStatus() { ... }
...
...
public void Create() { ... }
}

控制器逻辑:

public class OrderController {
private readonly IOrderRepository _orderRepository
public OrderController(IOrderRepository orderRepository)
{
orderRepository = _orderRepository
}
public IActionResult Create(Order order)
// this is bad because now I have a dependency on IOrderRepository and OrderService
OrderService orderService = new OrderService(orderRepository, order)
if (!orderService.CheckAlreadyExists()) {
orderService.Create();
}
end
}

我知道的两个选项:

  1. 重构代码,将运行时数据传递给每个函数,而不是
  2. 创建工厂OrderServiceFactory

我不想把参数传递给每个依赖于同一个对象的方法。每次我需要这个模式的时候都创建一个工厂,这似乎是多余的,这似乎应该是一个常见的用例。

我想我从根本上误解了一些事情。

  • 是否有我不知道的模式?
  • 我可以创建一个跟踪运行时数据的服务吗?
  • 还是我太固执了,应该建一个工厂?

我会简单地评论,但我没有这个名声。长话短说,您需要将运行时数据传递给OrderService。阅读Nkosi提供的链接。

使用特定的Order实例化OrderService是没有意义的。这意味着您必须为获得的每个订单新建OrderService。相反,OrderService应该具有生命周期范围。例如,你可以对多个订单使用同一个OrderService实例。将运行时数据传递给服务的每个方法并不过分;它的标准。如果强迫服务依赖于它所服务的对象的实例,就会使事情变得过于复杂。而且你的OrderRepository根本不应该被注入到你的控制器中。使用服务调用存储库方法。

最新更新