0

目前正在研究 DDD,我已经阅读了 Eric Evans 的大部分蓝皮书。到目前为止很有趣:)

我一直在对一些聚合进行建模,它们包含一组过期的实体。我想出了一种通用的表达方法:

public class Expirable<T>
{
    public T Value { get; protected set; }
    public DateTime ValidTill { get; protected set; }

    public Expirable(T value, DateTime validTill)
    {
        Value = value;
        ValidTill = validTill;
    }
}

我很好奇最好的方法是使 Expirable 无效(在一组工作时将其无效或省略)。到目前为止,我一直在考虑在 Repository 构造函数中执行此操作,因为这是您从中访问聚合并充当“集合”的地方。

我很好奇是否有人提出了解决此问题的解决方案,我很高兴听到它:) 其他方法也非常受欢迎。

2013 年 10 月 1 日更新:

这不是 Greg Young 的 CQRS/ES 方法的 DDD。但是 Evans 的方法,因为我刚开始接触这本书和第一个应用程序。就像 Greg Young 说的,如果你要制作好桌子,你必须先制作几张;)

4

3 回答 3

1

可能有多种方法可以解决这个问题,但我个人会使用规范模式来解决这个问题。假设对象过期是属于域的业务规则,除了您编写的类之外,我还会有一个规范。这是一个例子:

public class NotExpiredSpecification
{
    public bool IsSatisfiedBy(Expirable<T> expirableValue)
    {
        //Return true if not expired; otherwise, false.
    }
}

然后,当您的存储库返回聚合列表或对集合执行任何业务操作时,这可用于将集合限制为未过期的值,这将使您的代码具有表现力并将业务逻辑保持在域内。

要了解有关规范模式的更多信息,请参阅本文

于 2013-01-04T22:15:09.347 回答
0

我在我的抽象存储库中添加了一个方法InvalidateExpirable。一个例子是UserRepository我在活动用户会话中删除的地方,如下所示:InvalidateExpirable(x => x.Sessions, (user, expiredSession) => user.RemoveSession(expiredSession));.

的签名 InvalidateExpirable看起来像这样:protected void InvalidateExpirable<TExpirableValue>(Expression<Func<T, IEnumerable<Expirable<TExpirableValue>>>> selector, Action<T, Expirable<TExpirableValue>> remover). 该方法本身使用反射从选择器参数中提取选定的属性。该属性名称粘在通用 HQL 查询中,该查询将遍历调用 remove lambda 的集合。user.RemoveSession将从聚合中删除会话。通过这种方式,我让聚合对其自己的数据负责。同样在RemoveSession域中为将来的情况提出事件。

示例见:https ://gist.github.com/4484261

到目前为止工作得很好,不过我必须看看它在应用程序中是如何工作的。

于 2013-01-05T19:52:32.300 回答
0

一直在阅读使用 CQRS/ES(Greg Young 方法)的 DDD,并在 MSDN 网站上找到了一个关于 CQRS/ES 的好例子:http: //msdn.microsoft.com/en-us/library/jj554200.aspx

在此示例中,他们使用命令消息队列在将来对 Expire 消息进行排队,这将在指定时间调用 Aggregate 从聚合中删除/停用可过期构造。

于 2013-01-10T22:30:26.540 回答