将 UnitOfWork 用于业务逻辑?

Using UnitOfWork for Business logic?

我试图了解何时以及如何在 "correct way"..一个东西 "flavour"..

无论如何..我不明白的是,几个月前我加入了一个项目,他们也在该项目中使用 UOW 作为业务逻辑..在阅读了一些关于它的帖子后似乎并没有很有道理.. 因为据我了解,UOW 的主要目的是处理从您的应用程序到数据源(数据库)的 "transactions",对吗?

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

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

所以... "bundle up" 商业逻辑与 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 是一个 属性.. 所以是的.. 它是一个对象引用,而不是带有一堆静态函数的 class。

Br, 指数

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

此外,如果您要实现任何编码逻辑,我会创建一个值对象 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(不确定)。

A Unit of Work keeps track of everything you do during a business transaction that can affect the database. When you're done, it figures out everything that needs to be done to alter the database as a result of your work.

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

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

您是否询问过您的团队他们想要实现的目标?