我正在使用域驱动设计方法开发应用程序。在特殊情况下,我必须检索聚合的值对象列表并显示它们。为此,我创建了一个只读存储库,如下所示:
public interface IBlogTagReadOnlyRepository : IReadOnlyRepository<BlogTag, string>
{
IEnumerable<BlogTag> GetAllBlogTagsQuery(string tagName);
}
BlogTag是博客聚合中的一个价值对象,现在它运作正常但是当我想到这种处理方式和项目的未来时,我的担忧就会增长!为这些案例中包含的每个价值对象创建一个单独的只读存储库不是一个好主意,是吗? 谁知道更好的解决方案?
答案 0 :(得分:3)
您不应将值对象保留在自己的存储库中,因为只有聚合根属于那里。相反,您应该仔细检查您的域模型。
如果您需要跟踪跨越多个聚合的值对象,那么它们可能属于另一个聚合(例如标签云),甚至可以作为标签的工厂类型。
这并不意味着您在Blog聚合中不需要BlogTag值对象。一个聚合中的值对象可以是另一个中的实体,也可以是聚合根本身。
也许你应该看看this question。它解决了类似的问题。
答案 1 :(得分:2)
我认为你只需要一个查询服务,因为这个方法服务于用户界面,它只是用于表示(报告),做类似的事情。
public IEnumerable<BlogTagViewModel> GetDistinctListOfBlogTagsForPublishedPosts()
{
var tags = new List<BlogTagViewModel>();
// Go to database and run query
// transform to collection of BlogTagViewModel
return tags;
}
此代码位于应用程序层级而非域层。
注意我在方法名称中使用的语言,它使它更加明确,并告诉人们使用查询确切的方法做什么(如果这是你的意图 - 我猜一点,但希望你得到什么我的意思是。)
干杯 斯科特