- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个域模型,其中包含编辑器和项目的概念。
一个编辑者拥有多个项目,一个项目不仅有一个编辑者所有者,还拥有多个编辑者成员。因此,一个编辑器也有多个“加入”的项目。
我采用 DDD 方法对此进行建模,并使用存储库模式进行持久化。但是,我还没有充分理解该模式,无法确定应该如何执行此操作。
我正在假设编辑器和项目可能位于同一聚合中,根为编辑器。因此,我可以获得一个编辑器,然后枚举其项目,并可以从那里枚举项目的成员编辑器。
但是,如果我只允许从我的存储库中检索编辑器,这是否意味着当我获得拥有它们的编辑器时,我必须从存储库中加载所有项目?如果我想延迟加载成员编辑器,项目还需要对存储库的引用?
或者,如果我拆分聚合并拥有编辑器存储库和项目存储库,我应该如何处理两者之间的事务,例如将新项目添加到编辑器时?例如:
Editor e = new Editor("Editor Name");
editorRepository.Add(e);
Project p = e.CreateProject("Project Name");
projectRepository.Add(p); // These two lines
editorRepository.Save(e); // should be atomic
我是否误解了存储库模式的意图?
最佳答案
Am I misinterpreting the intent of the Repository pattern?
我会说“是的”,但要知道我和我共事过的每个人都出于同样的原因问过同样的事情......“你不是在第四维度思考,马蒂”。
让我们稍微简化一下,首先使用构造函数而不是 Create 方法:
Editor e = new Editor("Editor Name");
e = editorRepository.Add(e);
Project p = new Project("Project Name", e);
p = projectRepository.Add(p);
在下面,您的项目存储库始终在创建项目数据时将有效所有者 (p.EditorId
) 存储到项目数据中,无论您如何重新填充编辑器的项目,它都会在那里。这就是为什么将所有必需的属性放入构造函数中是一个好习惯。如果您不想传递整个对象,只需 e.Id
即可。
And if I want to lazy load the member Editors, the Project needs a reference to the repository as well?
现在,至于如何根据需要重新填充编辑器的项目,您有几种选择,具体取决于您的目的。 Straight Repository 说你想要:
IEnumerable<Project> list = projectRepository.GetAllProjects()
.Where(x => x.editorId == e.Id);
但是该把它放在哪里呢?不在项目或编辑器内部,你是对的,否则他们将必须访问存储库,这不好。上面的代码片段是松散耦合的,但不能单独重用。您刚刚达到了存储库模式的极限。
接下来是您的应用程序的适配器层,具有共享的存储库源(StaticServiceWrapper
)和某种 EditorAdapter 对象(或 Aggregate 或任何您所说的名称),或者现在您可以混合扩展方法,可以流畅地与任何和所有必要的存储库对话。我还没有在生产系统中完全按照这种方式完成,但向您展示一个简洁的示例:
public static class Aggregators
{
// one to one, easy
public static Editor GetOwner(this Project p)
{
return StaticServiceWrapper.editorRep.GetEditorById(p.editorId);
}
// one to many, medium
public static IEnumerable<Project> GetProjects(this Editor e)
{
return StaticServiceWrapper.projectRep.GetAllProjects()
.Where(x => x.editorId == e.Id);
}
// many to many, harder
public static IEnumerable<Editor> GetMembers(this Project p)
{
var list = StaticServiceWrapper.projectMemberMap.GetAllMemberMaps()
.Where(x => x.projectId == p.projectId);
foreach ( var item in list )
yield return StaticServiceWrapper.editorRep.GetEditorById(item.editorId);
}
}
基本上,一旦您的 GetAll、GetById、添加、更新、删除对象存储库完成,您就必须保留关联并继续沿着对象/层层次结构向上移动到适配器、缓存和业务逻辑等有趣的部分(“哦,天哪!”)。
关于domain-driven-design - 存储库模式 : how to Lazy Load? 或者,我应该拆分此聚合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/458146/
我遇到了搜索引擎优化问题,用户可以通过指定任何子域访问我的站点。这会导致 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 记录。我可以使用以下代码进行查询,但它需
我是一名优秀的程序员,十分优秀!