加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

设计模式 – 如何使用依赖注入和存储库处理工作单元

发布时间:2020-12-14 04:52:28 所属栏目:百科 来源:网络整理
导读:我继承了一些具有UnitOfWorkFactory的代码,该代码在每个存储库方法中创建一个工作单元.问题是单个存储库方法很少是完整的工作单元,所以如果说OrderService.PlaceOrder出现问题,它不能只回滚/丢弃该工作单元,因为它不是一个单元. 查看代码,我认为应该将工作单
我继承了一些具有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();
        }
    }
}

Serivce:

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);
    }
}

解决方法

我没有简短的答案.你可以在我之前写过的关于这个主题的博客文章中查看完整的答案. [Yet Another UoW,Repository Article]. ?(如果您阅读文章,请告诉我您的想法)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读