我收到了一些代码,其中包含一个UnitOfWorkFactory,它在每个存储库方法中创建工作单元。问题是单个存储库方法很少是完整的工作单元,因此如果在OrderService.PlaceOrder中出现问题,它无法回滚/丢弃该工作单元,因为它不是一个单元。
看代码,我认为工作单元应该移动到服务类或演示文稿中。然后我的问题是如何将其传递给服务或存储库?演示者会传递服务实例,并将服务传递给存储库实例。
我可以创建工作单元并将其注入服务、存储库和演示文稿的构造函数中,但它将超出单个工作单元的范围。这是一个桌面应用程序,因此演示文稿及其接收的任何服务可以活多个工作单元。
我能想到的唯一传递工作单元的方法是将其添加为所有服务/存储库方法的参数。但我认为肯定有更好的方法,我错过了什么吗?
参考代码:
存储库:
看代码,我认为工作单元应该移动到服务类或演示文稿中。然后我的问题是如何将其传递给服务或存储库?演示者会传递服务实例,并将服务传递给存储库实例。
我可以创建工作单元并将其注入服务、存储库和演示文稿的构造函数中,但它将超出单个工作单元的范围。这是一个桌面应用程序,因此演示文稿及其接收的任何服务可以活多个工作单元。
我能想到的唯一传递工作单元的方法是将其添加为所有服务/存储库方法的参数。但我认为肯定有更好的方法,我错过了什么吗?
参考代码:
存储库:
class OrderRepository
{
public UnitOfWorkFactory UnitOfWorkFactory;
public OrderRepository(UnitOfWorkFactory unitOfWorkFactory)
{
UnitOfWorkFactory = unitOfWorkFactory;
}
public void Save(Order order)
{
using(var uow = UnitOfWorkFactory.Create())
{
// save order
uow.commit();
}
}
}
服务:
class OrderService
{
protected IOrderRepository OrderRepository;
protected IProductService ProductService;
public OrderService(IOrderRepository orderRepository, IProductRepository productService)
{
OrderRepository = orderRepository;
ProductService = productService;
}
public void PlaceOrder(Order order)
{
foreach(var item in order.Items)
{
if(!ProductService.IsInstock(item.Product, item.Quantity))
throw new ProductOutOfStockException(product);
ProductService.MarkForDispatch(item.Product, item.Quantity);
}
OrderRepository.Save(order);
}
public void CancelOrder(Order order)
{
ProductService.UnmarkForDispatch(item.Product, item.Quantity);
order.IsCanceled = true;
OrderRepository.Save(order);
}
}
主持人:
class OrderPresenter
{
protected IOrderView OrderView;
protected IOrderService OrderService;
public OrderPresenter(IOrderView orderView, IOrderService orderService)
{
OrderView = orderView;
OrderService = orderService;
}
public void PlaceOrder()
{
OrderService.PlaceOrder(order);
}
public void CanelOrder()
{
OrderService.CancelOrder(order);
}
}