访问存储库中的 UnitOfWork 是不好的设计吗?

Posted

技术标签:

【中文标题】访问存储库中的 UnitOfWork 是不好的设计吗?【英文标题】:Is it bad design to have access to the UnitOfWork in the Repository? 【发布时间】:2013-05-02 18:24:09 【问题描述】:

背景:Entity framework4.1 和 MVC4

我的设置有模型实体,然后是通用存储库,然后是从通用存储库继承的 UserRepository、ProductRepository 等特定存储库的模型。

然后我有一个使用这些存储库以及任何业务逻辑的服务层,并且可以在此处访问 UnitOfWork 对象以调用 Commit。

使用工作单元模式,我的问题是:

让存储库层可以访问 UnitOfWork 对象是不是很糟糕?

对我来说,这似乎是一个“泄漏”,因为现在事情可能在你甚至没有意识到的时候就已经提交了。

这对吗?

例如

public class ProductService



   public void SaveProduct(Product product)
   
      try
      
        productRepository.Save(product);
        statsRepository.Update(product);
        this.UnitOfWork.Commit();
       catch(..) 
      
            //
      
      finally()
      
        //
      


   


现在,如果其中任何一个调用失败,则不会调用 commit。

但是如果在 abcRepository 层中您可以访问 UofW 对象并调用了 commit,它的行为方式就会不一致。

【问题讨论】:

在我看来,创建工作单元的事物应该有责任成为提交者。存储库可能没有该特定工作单元的完整上下文。 我之前看到UnitOfWork 的方式是UnitOfWork 可以访问存储库,而不是相反。 @Matthew 所以在我的例子中这将在 MVC 控制器中,然后我将它传递给 ABCService 类。 我认为这是有道理的,@Charles380 的建议听起来很适合我。 【参考方案1】:

我认为这是实现存储库和 UnitofWork 的正确方法

http://code.cmsstores.com/implementing-unit-of-work-pattern-dot-net/

【讨论】:

【参考方案2】:

我认为存储库不应该访问 u-o-w,正如 Matthew 已经评论的那样。您的问题几乎可以自行回答。

回复:现在,如果其中任何一个调用失败,则不会调用 commit。 -

一般来说,这很好,对吧?您不想部分提交更改。

【讨论】:

以上是关于访问存储库中的 UnitOfWork 是不好的设计吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring REST Api——访问存储库中的用户详细信息

实体框架:部分更新记录不起作用

如何使用 GitHub REST API 通过我的个人访问令牌访问组织拥有的私有存储库中的文件数据?

我的 Gitlab 存储库中的 Web 访问 HTML 文件

使用 UnitOfWork 模拟上下文和存储库

Spring Boot 存储库中的 API 与 DAO