首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD -可持续的

DDD -可持续的
EN

Stack Overflow用户
提问于 2013-01-04 20:51:38
回答 3查看 344关注 0票数 0

目前深入到DDD和我已经读了大部分的大蓝皮书埃里克埃文斯。到目前为止相当有趣:)

我一直在对一些聚合进行建模,它们持有一组过期的实体。我想出了一个通用的方法来表达这一点:

代码语言:javascript
复制
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。但埃文斯的做法是这样的,因为我刚开始读这本书和第一个应用程序。就像格雷格杨说的,如果你要做好桌子,你必须先做几张;)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-10 22:30:26

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

在本例中,他们使用命令消息队列对将来的过期消息进行排队,该消息将在指定的时间调用聚合--从聚合中删除/禁用可重用的构造。

票数 0
EN

Stack Overflow用户

发布于 2013-01-04 22:15:09

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

代码语言:javascript
复制
public class NotExpiredSpecification
{
    public bool IsSatisfiedBy(Expirable<T> expirableValue)
    {
        //Return true if not expired; otherwise, false.
    }
}

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-05 19:52:32

我向我的抽象存储库InvalidateExpirable添加了一个方法。例如,我在活动用户会话中删除的UserRepositoryInvalidateExpirable(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中的一个示例

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14164790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档