Domain driven design 检索不带Aggreteroot的值对象

Domain driven design 检索不带Aggreteroot的值对象,domain-driven-design,Domain Driven Design,我正在用域驱动设计方法开发一个应用程序。在一种特殊情况下,我必须检索聚合的值对象列表并显示它们。为此,我创建了一个只读存储库,如下所示: public interface IBlogTagReadOnlyRepository : IReadOnlyRepository<BlogTag, string> { IEnumerable<BlogTag> GetAllBlogTagsQuery(string tagName); } 公共接口IB

我正在用域驱动设计方法开发一个应用程序。在一种特殊情况下,我必须检索聚合的值对象列表并显示它们。为此,我创建了一个只读存储库,如下所示:

 public interface IBlogTagReadOnlyRepository : IReadOnlyRepository<BlogTag, string>
    {
        IEnumerable<BlogTag> GetAllBlogTagsQuery(string tagName);
    }
公共接口IBlogTagReadOnlyRepository:IReadOnlyRepository
{
IEnumerable GetAllBlogTagsQuery(字符串标记名);
}
BlogTag是Blog聚合中的一个值对象,现在它工作得很好,但是当我想到这种处理方式和项目的未来时,我的担忧增加了!为这些案例中包含的每个值对象创建单独的只读存储库不是一个好主意,是吗?
有人知道更好的解决办法吗

您不应该将值对象保留在它们自己的存储库中,因为只有聚合根属于它们。相反,您应该仔细检查您的域模型

如果需要跟踪跨越多个聚合的值对象,那么它们可能属于另一个聚合(例如标记云),甚至可以作为标记的工厂

这并不意味着在博客聚合中不需要BlogTag值对象。一个聚合中的值对象可以是另一个聚合中的实体,甚至可以是聚合根本身


也许你应该看看。它解决了一个类似的问题。

您不应该将值对象保留在它们自己的存储库中,因为只有聚合根属于它们。相反,您应该仔细检查您的域模型

如果需要跟踪跨越多个聚合的值对象,那么它们可能属于另一个聚合(例如标记云),甚至可以作为标记的工厂

这并不意味着在博客聚合中不需要BlogTag值对象。一个聚合中的值对象可以是另一个聚合中的实体,甚至可以是聚合根本身


也许你应该看看。它解决了一个类似的问题。

我认为您只需要一个查询服务,因为此方法服务于用户界面,它只是用于演示(报告),执行类似的操作

public IEnumerable<BlogTagViewModel> GetDistinctListOfBlogTagsForPublishedPosts()
{
    var tags = new List<BlogTagViewModel>();

    // Go to database and run query
    // transform to collection of BlogTagViewModel

    return tags;
}
public IEnumerable GetDistinctListOfBlogTagsForPublishedPosts()
{
var tags=新列表();
//转到数据库并运行查询
//转换为BlogTagViewModel的集合
返回标签;
}
此代码将位于应用程序层而不是域层

请注意我在方法名称中使用的语言,它使它更加明确,并准确地告诉使用查询的人该方法做什么(如果这是您的意图-我猜一点,但希望您理解我的意思)

干杯
Scott

我认为您只需要一个查询服务,因为此方法服务于用户界面,它只是用于演示(报告),执行类似

public IEnumerable<BlogTagViewModel> GetDistinctListOfBlogTagsForPublishedPosts()
{
    var tags = new List<BlogTagViewModel>();

    // Go to database and run query
    // transform to collection of BlogTagViewModel

    return tags;
}
public IEnumerable GetDistinctListOfBlogTagsForPublishedPosts()
{
var tags=新列表();
//转到数据库并运行查询
//转换为BlogTagViewModel的集合
返回标签;
}
此代码将位于应用程序层而不是域层

请注意我在方法名称中使用的语言,它使它更加明确,并准确地告诉使用查询的人该方法做什么(如果这是您的意图-我猜一点,但希望您理解我的意思)

干杯
Scott

谢谢,当然我在服务(应用程序)层也有相同的方法,但我说的是存储库层,我应该在其中获取值对象列表(它应该在同一个聚合根存储库或另一个只读存储库中?),通过我使用FlunetNhiberate和SQl Server的方式,您本身不需要存储库。谢谢,当然我在服务(应用程序)层也有相同的方法,但我说的是存储库层,我应该在其中获取值对象列表(它应该在同一个聚合根存储库或另一个只读存储库中?),通过我使用FlunetNhiberate和SQl Server的方式,您本身不需要存储库。