- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想创建一个成员(member)可以为元素出价的行动网站。为了对这个领域建模,我使用了三个类:Member、Item 和 Bid。我的头脑 Storm 会是这样的:
考虑到所有这些,很明显,由于 Member 和 Item 对象是独立的,我们可以将它们视为聚合根。出价将是这些汇总之一的一部分。这很清楚,但现在令我困惑的是我应该选择哪个聚合根?项目或成员?
这是 Apress 的 Pro ASP.NET MVC 3 Framework 一书中的例子,他们的做法如下:
给出以下代码:
public class Member
{
public string LoginName { get; set; } // The unique key
public int ReputationPoints { get; set; }
}
public class Item
{
public int ItemID { get; private set; } // The unique key
public string Title { get; set; }
public string Description { get; set; }
public DateTime AuctionEndDate { get; set; }
public IList<Bid> Bids { get; set; }
}
public class Bid
{
public Member Member { get; set; }
public DateTime DatePlaced { get; set; }
public decimal BidAmount { get; set; }
}
Member 和 Item 是这里的聚合根,Bid 包含在 Item 中。现在假设我有应用程序用例:“获取特定成员发布的所有出价”。这是否意味着我必须首先获取所有项目(例如,通过存储库接口(interface)从数据库中获取),然后枚举每个项目的所有出价以尝试找到匹配的成员?这不是有点低效吗?因此,更好的方法是在 Member 中聚合 Bid 对象。但在那种情况下,请考虑新的用例:“获取特定项目的所有出价”。现在我们又需要另辟蹊径来获得所有出价...
因此,考虑到我需要在我的应用程序中实现这两个用例,那么对这个领域建模的正确且有效的方法是什么?
最佳答案
您的域实际上应该仅反射(reflect)命令 (CQRS) 要求(更新/更改数据)。我假设您需要查询(读取数据,不更新/更改数据):“获取特定项目的所有出价”和“获取特定成员发布的所有出价”。因此,此“查询”与域无关,因为查询实现独立于命令实现(命令正在调用域方法)。这使您可以自由地以高效的方式实现每个查询。我的方法是实现一个高效的数据库 View ,让您只获取想要在 UI 中显示的数据。然后创建一个名为 BidForItemDto (DTO = data transfer object) 的新类,并将数据从 DB View 映射到 BidForItemDto 的集合中(您可以通过 ADO.NET 手动完成或使用 NHibernate(首选,为您完成一切))。与第二个查询相同,创建一个名为 BidPostedByMemberDto 的新类。
因此,如果您需要的是查询,只需忘记域,意识到它只是您想要在 UI 中显示的数据,并从数据库中高效地查询它们。只有当您在 UI 中执行某些操作(例如单击按钮进行出价)时,它才会执行“出价”命令,这将在最后调用域方法 Item.PlaceBid(Member member, DateTime date, decimal amount ).顺便说一句,恕我直言,它是一个“有很多出价”的项目,而域方法“出价”肯定需要访问以前的出价才能正确实现整个逻辑。将出价收集放入 Member 对我来说没有多大意义......
从我的脑海中浮现出一些数据库 View 和 sql 查询的例子:
获取特定项目的所有出价:
create view BidForItemDto
as
select
i.ItemId,
b.BidId,
b.MemberId,
b.DatePlaced,
b.BidAmount
from Item i
join Bid b ON b.ItemId = i.ItemId
查询:
SELECT *
from BidFormItemDto
where ItemId = <provide item id>
获取特定成员发布的所有出价:
create view BidPostedByMemberDto
as
select
m.MemberId,
b.BidId,
b.MemberId,
b.DatePlaced,
b.BidAmount
from Member m
join Bid b ON b.MemberId = i.MemberId
查询:
SELECT *
from BidPostedByMemberDto
where MemberId = <provide member id>
关于domain-driven-design - DDD : Modeling simple domain with two aggregate roots,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11065834/
我遇到了搜索引擎优化问题,用户可以通过指定任何子域访问我的站点。这会导致 SEO 出现重复页面问题。 例如,如果用户错误输入“www”然后在论坛上发布了一个链接,则谷歌正在抓取“wwww.domain
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicates: Can I change all my links to just //? Network-Path Ref
我正在玩 lighttpd在小型虚拟专用服务器上。我两个域指向服务器。我在 Ubuntu 8.10 上使用最新版本的 lighttpd 和 mod_evhost。 我正在尝试设置一个规则,这样如果任何
我正在开发一个由 domain.ext 提供的网络应用程序。此 Web 应用程序使用基于 cookie 的 session ,并为用户提供在子域上托管包含自定义 JavaScript 的网页的能力,例
我想重定向: 情况一、example.com到subdomain.example.com 情况2.www.example.com到subdomain.example.com 我已将这两段代码放入我的
我遇到了“领域对象”这个术语,并在 Google 上找到了几个定义,但我只是想验证我的理解是否正确。 这是否只是表示业务规则的任何类 - 因为“域”一词通常表示特定于某些本地问题集的规则,例如如何计算
将我们的应用程序静态内容托管在一个完全不同的域上而不是像其他域一样托管在我们主域的子域上有什么好处吗?例如微软使用 i.microsoft.com,谷歌使用 gstatic.com,雅虎使用 yimg
Orbited的客户端JS组件( cometd 服务器),要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行 document.domain = document.domain; 在加载任
我通读了另一篇文章,但似乎没有人回答我一直遇到的问题。是否可以使用通配符域的通配符子域(即使它仅用于子域而不是子子域),例如:foo.example.local。 我已经有 example.local
我在 Google Domains 上有一个域名,我想指向我在家里的 raspberry pi 服务器上运行的网站。我的公共(public) IP 地址是动态的,当 IP 更新时,我无法弄清楚如何保持
我有这个经典的 DDD 问题;我有一个做一些事情的域服务“DetectPriority”。 PM 要求我创建 2 个不同的服务;一个 INTERNAL(包含完整的业务规则并涉及许多其他领域模型)和另一
An interesting thread我刚才输入这个问题时就出现了。但我认为它没有回答我的问题。 我一直在使用 .NET MVC3 进行大量工作,因此需要一个贫乏的模型。 View 模型和编辑模型
我正在通过docker-compose运行最新版本的Artifactory OSS(如here和here所述)。我的docker-compose文件看起来像这样: version: '2' servi
我正在阅读 MDC entry for nsICookieManager2.add它讨论了域和非域 cookie。这两种类型的 cookie 有什么区别? 最佳答案 来自 RFC2109: Host
这是我的问题:http://regexr.com?2temn 我相信对于你们中的一些正则表达式大师来说这很简单。 干杯! 最佳答案 这也有效: (?<=\.|)\w+\.\w+$ 仅使用 PHP 进行
这应该很简单,但我无法理解。有许多好的和坏的正则表达式方法来匹配 URL,有或没有协议(protocol),有或没有 www。我遇到的问题是这个(在 javascript 中):如果我使用正则表达式来
我有一个网站 http://mywebsite.tld ,我想将 www.mywebsite.tld 重定向到 http://mywesite.tld (所以 www=>非 www) (防止重复内容)
TL;DR 我应该从 www.domain.tld 重定向到 domain.tld 还是相反? 我正在运行一个处理多个域的 CMS。到目前为止,CMS 负责将 www.domain.tld 重定向到
我目前有以下代码: string user = @"DOMAIN\USER"; string[] parts = user.Split(new string[] { "\\" }, StringSpl
使用 Go 和 AWS-SDK 我正在尝试查询 AWS 控制台中 Route53 -> Hosted Zones 下列出的 route53 CNAME 和 A 记录。我可以使用以下代码进行查询,但它需
我是一名优秀的程序员,十分优秀!