【问题标题】:Using UnitOfWork for Business logic?将 UnitOfWork 用于业务逻辑?
【发布时间】:2015-08-04 14:23:45
【问题描述】:

我试图了解何时以及如何以“正确的方式”使用 UOW。我知道很可能有一堆正确和错误的方法,在某些情况下它可能归结为这样的事情“味道”..

无论如何.. 我不明白的是,几个月前我加入了一个项目,他们也在使用 UOW 进行业务逻辑.. 在阅读了一些关于它的帖子之后似乎没有多大意义.. 因为据我了解,UOW 的主要目的是处理从您的应用程序到数据源(数据库)的“事务”,对吗?

因此,例如在 DDD 中,您的存储库将成为 UOW 的一部分,因为您希望 DbContext(数据库连接)保持打开一段时间,以便您可以在多个存储库之间共享相同的 DbContext,然后在一个事务中执行对同一个 DbContex 的所有更改......我猜这是有道理的......

但是将例如服务或工厂(在 DDD 中)作为 UOW 的一部分并没有多大意义。因为它们不(或至少不应该)与任何 DbContext 或数据库交互..

那么...可以将业务逻辑与 UOW“捆绑”在一起吗?... 比如:

var html = UnitOfWork.HtmlFactory.EncodeString("<p>some string</p>");
UnitOfWork.HtmlStringRepository.Add(html);
UnitOfWork.SaveChanges();

这有意义吗?

这样做是否更有意义:

var html = HtmlFactory.EncodeString("<p>some string</p>");
UnitOfWork.HtmlStringRepository.Add(html);
UnitOfWork.SaveChanges();

??

哦!..在这种情况下,UnitOfWork 是一个属性.. 所以是的.. 它是一个对象引用,而不是具有一堆静态函数的类。

兄弟, 指数

【问题讨论】:

    标签: c# entity-framework unit-of-work


    【解决方案1】:

    不,UnitOfWork 不应该包含业务逻辑,它只应该关心事务边界。

    此外,如果您正在实现任何编码逻辑,我将创建一个 Value 对象 EncodedHtml,因为它代表了对业务有意义的东西。像这样

    public class EncodedHtml
    {
        public string Html {get; private set;}
    
        public EncodedHtml(string htmlToEncode){
            Html = EncodeHtml(htmlToEncode);
        }
    
        private string EncodeHtml(string htmlToEncode){
            // code 
            return htmlEncoded;
        }
    }
    

    现在,无论我在哪里看到这个 ValueObject,我都知道它已经过编码和验证,因此在这种情况下我可以将它附加到我的实体 HtmlString(不确定)。

    【讨论】:

    • 感谢您明确说明 :) 示例代码更多是为了说明我的观点,而不是实际实现,但是是的,制作 Html 编码的值对象很有意义:)
    【解决方案2】:

    工作单元会跟踪您在业务交易期间所做的所有可能影响数据库的事情。完成后,它会计算出根据您的工作更改数据库所需要做的一切。

    引用来自Martin Fowler,但我添加了亮点。我只看到了带有数据访问代码的工作单元模式,它通常不应该(可能永远)包含任何业务逻辑。

    所以我认为你的理解是正确的,示例代码看起来确实很奇怪。

    你有没有问过你的团队他们想要达到什么目标?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2012-02-09
      • 2010-12-18
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多