- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Udi Dahan 建议 fetching strategy作为用于数据访问的有用模式。我同意。
这个概念是让角色明确。例如,我有一个聚合根 - 客户。我希望在我的应用程序的多个部分中显示客户 - 可供选择的客户列表、客户详细信息的 View ,并且我想要一个按钮来停用客户。
Udi 似乎会为每个角色建议一个界面。所以我有 ICustomerInList
非常基本的细节,ICustomerDetail
其中包括最近购买的 10 件产品,以及 IDeactivateCustomer
它有一个方法来停用客户。每个接口(interface)只公开足够的我的客户聚合根以在每种情况下完成工作。我的客户聚合根实现了所有这些接口(interface)。
现在我想为每个角色实现一个抓取策略。每种策略都可以将不同数量的数据加载到我的聚合根中,因为它将位于仅公开所需信息位的接口(interface)后面。
实现这部分的一般方法是请求服务定位器或其他一些依赖注入(inject)方式。此代码将采用您想要的界面,例如 ICustomerInList
, 并找到一个加载策略 ( IStrategyForFetching<ICustomerInList>
)。此策略由一个类实现,该类知道仅向客户加载 ICustomerInList 接口(interface)所需的信息位。
到目前为止一切顺利。
您传递给服务定位器或 IStrategyForFetching<ICustomerInList>
的内容.我看到的所有示例都只通过已知 ID 选择一个对象。这种情况很简单,调用代码通过这个 id 并返回特定接口(interface)。
如果我想搜索怎么办?或者我想要客户列表的第 2 页?现在我想传递更多获取策略所需的术语。
我见过的一些示例使用谓词 - 如果特定的聚合根应该是结果集的一部分,则返回 true 或 false 的表达式。这在某些情况下工作得很好,但是如何取回前 n 个客户而不是更多呢?或者获取搜索结果的第 2 页?或者结果是如何排序的?
我的第一 react 是开始向我的 IStrategyForFetching<ICustomerInList>
添加通用参数现在变成IStrategyForFetching<TAggregateRoot, TStrategyForSelecting, TStrategyForOrdering>
.这很快就会变得复杂和丑陋。不同的存储库使它变得更加复杂。有些存储库仅在使用特定策略进行选择时才提供数据,有些仅提供某些类型的排序。我希望能够灵活地实现可以采用排序功能的通用存储库以及仅返回以特定方式排序的聚合根的专用存储库。
听起来我应该应用开始时使用的相同模式 - 如何明确角色?我是否应该实现使用负载 Y(搜索/排序参数)获取 X(聚合根)的策略?
如果我不是每次都返回聚合根,这仍然有效。如果每个接口(interface)都由不同的 DTO 实现,我仍然可以使用 IStrategyForFetching。这就是此模式如此强大的原因 - 获取的内容和返回的内容不必以任何方式映射到聚合根。
我最终使用了 IStrategyForFetching<TEntity, TSpecification>
. TEntity 是我想要得到的东西,TSpecification 是我想要得到它的方式。
最佳答案
你有没有遇到过CQRS ? Udi 是一个 big proponent of it ,其目的就是解决这个确切的问题。
最基本形式的概念是将领域模型与查询分开。这意味着域模型仅在您要执行命令/提交事务时才起作用。您不使用聚合和实体中的数据在屏幕上显示信息。相反,您创建一个单独的数据访问服务(或一组),其中包含提供每个屏幕所需的精确数据的方法。这些方法可以接受标准对象作为参数,因此可以使用您想要的任何标准进行搜索。
这是如何工作的快速顺序:
使用 CQRS 架构构建您的应用程序可以让您在性能和可扩展性方面有很多可能性。您可以通过为每个 View 、最终一致性和事件源创建包含非规范化表的单独查询数据库来进一步扩展这个简单示例。有很多关于 CQRS 的视频/示例/博客,我认为您会非常感兴趣。
我知道您的问题是关于“获取策略”的,但我注意到他在 2007 年写了这篇文章,他很可能认为 CQRS 是它的继任者。
总结一下我的回答:
关于domain-driven-design - 实现 Udi 的抓取策略——如何搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495832/
我遇到了搜索引擎优化问题,用户可以通过指定任何子域访问我的站点。这会导致 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 记录。我可以使用以下代码进行查询,但它需
我是一名优秀的程序员,十分优秀!