目前深入到DDD和我已经读了大部分的大蓝皮书埃里克埃文斯。到目前为止相当有趣:)
我一直在对一些聚合进行建模,它们持有一组过期的实体。我想出了一个通用的方法来表达这一点:
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;
}
}我很好奇,最好的方法是使一个可执行的(在集合中工作时无效或省略)无效。到目前为止,我一直在考虑在Repository构造函数中这样做,因为这里是您访问聚合并充当“集合”的地方。
我很好奇是否有人想出了解决这一问题的办法,我很高兴听到:)其他办法也很受欢迎。
更新10-1-2013年:
这不是来自格雷格·杨的CQRS/ES方法的DDD。但埃文斯的做法是这样的,因为我刚开始读这本书和第一个应用程序。就像格雷格杨说的,如果你要做好桌子,你必须先做几张;)
发布于 2013-01-10 22:30:26
一直在用CQRS/ES (Greg方法)阅读DDD,并在MSDN站点上找到了关于CQRS/ES:http://msdn.microsoft.com/en-us/library/jj554200.aspx的一个很好的例子。
在本例中,他们使用命令消息队列对将来的过期消息进行排队,该消息将在指定的时间调用聚合--从聚合中删除/禁用可重用的构造。
发布于 2013-01-04 22:15:09
可能有多种方法来解决这个问题,但我个人会使用规范模式来解决这个问题。假设对象过期是属于域中的业务规则,那么除了您编写的类之外,我还有一个规范。下面是一个示例:
public class NotExpiredSpecification
{
public bool IsSatisfiedBy(Expirable<T> expirableValue)
{
//Return true if not expired; otherwise, false.
}
}然后,当存储库返回聚合列表或在集合上执行任何业务操作时,可以将集合限制为未过期的值,这将使代码具有表现力并将业务逻辑保留在域中。
要了解有关规范模式的更多信息,请参见本论文。
发布于 2013-01-05 19:52:32
我向我的抽象存储库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的集合。user.RemoveSession将从聚合中删除会话。这样,我就让聚合负责它自己的数据。此外,在RemoveSession中,将为将来的情况引发域事件。
参见:https://gist.github.com/4484261中的一个示例
到目前为止,我的工作还不错,不过我必须看看它在应用程序中是如何工作的。
https://stackoverflow.com/questions/14164790
复制相似问题