标签存档:DDD

链接到我最近的DDD+EFCore内容

是时候将我创建的各种文章和视频聚合在一起了,这些文章和视频充满了关于EF Core支持域模型直接映射到关系数据库的经验教训:


领域驱动的设计欧洲2018在阿姆斯特丹

我很高兴能在2018年2月1日至2日在阿姆斯特丹参加DDD欧洲2018大会并发表演讲。亚博国际网页我很荣幸能和这么多DDD大师以及其他拥有惊人DDD经历的人一起分享我的故事。

最低的早鸟票价格仍然可以买到截至11月30日,599欧元(+21%增值税)=724欧元(应用程序)~ 860美元+)。票将转到699欧元(增值税)从12月1日到12月31日,然后到749欧元(增值税)直到会议。

在会议之前,还有10个令人惊叹的研讨会,从1月30日到1月31日,从半天到两天不等。

我将在会议期间做一个2小时的研讨会,讨论如何使用ef core 2在您的领域中映射DDD模式。这将是一个实际操作的研讨会,我的目的是为与会者建立一些Koan。尽管随着我不断渗透思想,动手的味道可能会改变。

观看我的领域驱动设计基础课程

dbcontext.add-in-efcore(和ddd-win)的另一个用例

如果您像我一样,按照域驱动的设计原则设计类,您可能会发现自己使用这样的代码来控制如何将对象添加到根实体中的集合中。

public class Samurai {public Samurai (string name): this() {name = name;}private samurai()u quotes=新列表
          
           ();}公共int id get;私人集合;}公共字符串名称get;私人集合;}private readonly list _quotes=new list()private ienumerable quotes=>_quotes.tolist();{var newQuote=new Quote(quoteText,Id);_ QUOTES.ADD(新报价);}
          

我有一个完全封装的报价集合。添加新报价的唯一方法是通过addQuote方法。你不能只叫samura.quotes.add(myquote)。

此外,因为我想控制开发人员如何与我的API交互,没有用于引号的DbSet。您必须通过context.samurais执行所有查询和更新。

这样做的一大缺点是,如果我有一个新的报价,我知道武士的身份,我必须先查询武士,然后使用addquote。这真让我恼火。我只想创建一个新的引用,输入武士的ID值并保存。这需要原始SQL或dbset .我不喜欢这两种选择。在这种情况下,原始SQL是一种黑客,dbset 将打开我的API以防止潜在的误用。

今天早上我躺在床上思考这个问题(承认吧,这是你醒来后做的第一件事,同样,我有个主意。

在EF核心中,我们现在可以直接将对象添加到上下文中,而不必通过dbset。上下文可以找出实体所属的dbset,并将正确的信息应用到变更跟踪器。我以为这对打电话很方便

myContext.addRange(个人对象,accountobjectB,productObjectC);

尽管我还没有遇到一个很好的利用它的用例。

我想到的是,如果dbContext.add是使用反射,也许EF Core可以找到a私有的dBSET

所以我在dbContext类中添加了一个私有dbset:

私人DbSet
          
           引用{得到;集合;}
          
并尝试了此代码(注意我正在使用context.add,不是context.quotes.add):
静态void AddQuoteToSamurai () {using (var context =newSamuraiContext ()) {var quote=newQuote("Voila",1);添加(引用);context.saveChanges();}
效果不错!但这还没有完成。我违反了确保只有聚合根才能管理引用的规则。所以这是“危险的”从我的DDD角度看代码。然而,我很高兴知道EF Core将支持这种功能。
目前,samurai.addQuote没有要对报价执行的任何附加逻辑。如果我加上一个“删除关键词”呢?报价单添加前的规则?
public void addquote(字符串QuoteText)utilities.removeBadWords(QuoteText);var new quote=新报价(QuoteText,ID);_ QUOTES.ADD(新报价);}
现在我有一个重要的理由使用武士来做这件事。我可以再加一秒钟,静态addQuote方法,也接受int。因为它是静态的,这是一个传递方法。
公共静态引号addquote(string quotext,int samuraiid)utilities.removebadwords(quotext);var newquote=newquote(quotext,samuraiid);返回newQuote;}

这是可行的,现在我不需要有武士的实例来使用它:

staticvoid addquotetosamurai()使用(var context=newsamuraicontext())context.add(samurai.addquote(“static voila”,1));context.saveChanges();}

我担心的一件事是,如果我有一个武士的例子,并试图用它来增加一个引用到另一个武士。这将打破聚合根…它的工作是只管理自己的报价。它不应该知道其他武士。

但是。net保护了我。我不能从Samurai实例中调用静态方法。

我仍然认为从DDD的角度来看,有一点代码味道是关于静态的,在聚合根中传递方法,因此必须对其进行调查(或等待我的注释中出现任何不满意的ddder)。但现在我很高兴我可以避免为了完成这项任务而去查询武士的实例。

多元化视野下的企业课程全新EF

我的孩子在这儿!崭新的企业实体框架yabo官网.

(参见:新英孚多元视野核心课程!]

2012,我发表了一门关于Pluralsight的课程,名为《企业中的实体框架》(Entity Framework in the Enterprise)。yabo官网从那以后我学到了很多,最重要的是,我变得非常活跃领域驱动设计,甚至出版DDD基础知识我和史蒂夫史密斯共同创建的课程。这对我如何设计和设计软件产生了很大的影响,反过来,我如何把EF融入到大,复杂的应用程序。

我一直想重修这门古老的课程来分享我的新观点。我终于在今年一月开始工作了,但有3个月的会议旅行暂停。所以,虽然我感觉自己像个婴儿,我花了9个月的时间,实际上只有6个月。还很长时间!

课程现在正在现场直播!企业实体框架yabo官网

在这个过程中,我使用VS2015和EF6。为什么EF6 ?因为EF核心太新了。我讨论和演示的大多数模式完全适用于EF核心。有一件事还没有在EF核心:值对象,但这就要来了。此外,测试模块的重点是模拟,没有考虑到EF核心的新内存提供者。除此之外,你也可以用你在英孚核心中学到的东西。

我花了很多心思在这门课上,我认为这篇关于这门课的论坛的评论很好地表达了这一点:

我三周前刚看过朱莉·勒曼之前在企业中的实体框架,yabo官网在新课程发布之前,我很高兴她更新了课程。我原以为之前的版本有点过时(2016 vs 2012&EF6 vs EF4),还有点基本,朱莉称之为演示软件。这个更新后的课程将详细介绍架构项目,使用EF6改进了MOQ测试,以及更好地解释使用模式来分隔区域的有界上下文的DDD。我已经对EF有了很好的了解,DDD,存储库,哎哟,在观看之前,虽然我不会在自己的应用程序中以100%的方式设置内容,但它们确实启动了一些重构,并重新思考了如何维护我的解决方案,这就是这些课程的目的,随着科技的发展,就像实体框架一样。yabo官网感谢您更新课程和观看过上一版本的人,一定要送这块新表。

形象

即将到来的EF多元化视野课程

9/14:有人告诉我“再过几天”。相信我,我和任何人一样渴望这个被释放!

9/23:在这里!!!!

https://app.pluralsight.com/library/courses/entity-framework-enterprise-update/table-of-contents

年初,我在企业课程中开始了我的EF的全新版本。那一个已经有多年了,在dbContext和code首次出现之前就已经使用了ef4。在我开始学习领域驱动设计之前。

在我的日程安排中,我有很多副作用,包括3个月的会议旅行和关于如何解释和演示其中一些概念的许多苦思冥想。但我昨天终于完成了最后一个模块。我有一些工作要做,以回应一些模块的技术审查,我必须做的可怕的任务,提出几个模块的问题。但接下来,它将准备好让多元论者推动并出版。我想不会太久的。

当我在这门课上使用EF6时,大多数想法也适用于EFCore。

与此同时,我可以告诉你这门课的8个模块的标题,它们的总时长似乎不到5个小时:

  1. 构建数据层
  2. 了解ef封装和伟大的知识库辩论
  3. 使用EF6实现封装模式
  4. 管理复杂域和数据模型:DDD有界上下文的经验教训
  5. 重构到域驱动的设计边界上下文:演练
  6. 处理断开图的状态
  7. 用实体框架映射DDD域模型yabo官网
  8. 在涉及实体框架时测试应用程序yabo官网

注意新课程的这个空间:小精灵

埃里克·埃文斯关于独立数据存储的引述

我需要保留这句话,那么哪里比我的博客更好呢?

“只要我记得,我一直主张开发复杂逻辑的团队应该有自己独立的数据存储,而不必共享一些庞大的数据库,这些数据库将不同的人对数据应该是什么的想法混为一谈,等等。”

(Eric Evans,“DDD与微服务:终于,有些界限!”2015年12月去柏林(gotober.com)https://www.youtube.com/watch?V= YVEVEF9R3K-M

对于这么多开发人员来说,这是一件很难接受的事情。我经常和大家分享埃里克的故事,他试图让我从几近崩溃的精神状态中解脱出来,当我在这方面挣扎的时候(我在解释,可能在这一点上增加了一些我自己的理解),我向我解释,你必须在某个地方付出代价,而且解决在不同的地方拥有需要一段时间连接的数据的问题,通常比处理系统的复杂性要简单得多。试图为所有问题提供所有答案的新兴市场。我们有模式来解决“偶尔连接一次数据”问题(例如)消息队列)。

我承认我必须建议人们目标但这通常不实际(或不划算),所以如果我们谈论的是关系数据库,那么我们至少可以用模式进行隔离。但我确实试着从“单独的数据库”开始如果这不可行(或者如果我所说的那个人或团队看起来要杀了我),我们就从那里往后退一步。然而,每后退一步都是有代价的。你只需要选择——选择你的毒药。只要你掌握了正确的信息来做出这些决定和选择,我认为这是最重要的部分。

我的欧洲科技日程

teeu ou 2014 ou我是说亚博国际网页我很高兴能很快去巴塞罗那欧洲辣妹.你可能知道,也可能不知道我去年的希望破灭了。但当我第二天旅行时发现自己卡在芝加哥奥黑尔机场,只是被告知我要到周四下午才能到达马德里(经过4天的旅行后),是时候转身回家了。我还安排了一次赛后的巴塞罗那之旅——这也是,我取消了。

我有点惊讶于TechEd愿意再次尝试考虑我的糟糕历史,但我将在2014年版的活动上发言。亚博国际网页

我不仅期待着我的第一次西班牙之旅和巴塞罗那这座神奇的城市,但这将是我第一次有机会见到这么多我从未见过的开发人员。

我的会话

我的演讲在星期五,10月31日下午12:1:15。对,在万圣节!

域驱动设计有界上下文中的实体框架模型划分yabo官网
有界上下文是领域驱动设计(DDD)中最关键的模式之一。虽然在建模领域时不必担心数据持久性,当需要实现数据层时,不知道如何让ORM与DDD模式保持一致仍然令人担忧。实体框架示例解决方案创建一个大型模型来映射到一个大型数据库,以满足应用程序的所有需求,这一历史悠久。yabo官网在本课程中,我们将研究使用实体框架的模式,该框架不仅支持软件中的多个有界上下文,甚至还支持那些满足于纯CRUD逻辑的领域。yabo官网在使用实体框架实现数据持久性时,您还将看到一些模式,用于在这些有界上下文之间架起桥梁。yabo官网

充分利用我的课程

迪诺·埃斯波西托将在周二做一个相关的演讲,如果你对领域驱动的设计还不熟悉的话,这个演讲会很有用。

dev-b211用Microsoft.NET架构和实现域驱动的设计模式周二,10月28日下午1:30–下午2:45房间:8.1厅G室

我还建议您观看领域驱动设计基础课程,史蒂夫。史密斯我为小精灵.它大约4个小时长,是一个伟大的第一眼,以及对一些关键概念的复习DDD。如果你事先看过这个,你肯定会从我的演讲中得到更多。如果你没有Pluralsight的订阅,给我一个便条,我可以给你一个30天的试用代码。

哪里可以找到我

这是我目前的日程安排。这里没有列出我计划参加的会谈,但我必须有机会结识一些人和极客!微笑

形象

如此灿烂,我就是无法选择!

teeu ou 2014 ou我是说亚博国际网页teeu ou 2014 ou我是说亚博国际网页teeu_2014_我说的是\3亚博国际网页

DDD基础课程与众不同

史蒂夫。史密斯我很高兴能得到这样的反馈领域驱动的多元视野基础课程.我们想让开发人员帮助理解基础知识,这样他们就可以深入挖掘更深入的资源,比如埃里克·埃文斯(EricEvans)或沃恩·弗农(VaughnVernon)的书。

以下是我们最近看到的一些推文。


瑞安·莫斯利@ BaHaMaBy85

完成DDD基础课程@pluralsight由@阿达里斯@julielerman http://pluralsight.com/courses/domain-driven-design-fundamentals ....本课程使DDD变得容易。

很难找到不具备一定知识水平的DDD示例。所以这门课很受欢迎。


汤姆·戴维斯@photomoose · 9月9日

@julielerman刚刚看了你的DDD课程@多视点.可能是我见过的最好的DDD介绍;现在一切都有意义了!


保罗黑尔@保尔黑尔 · 8月29日

@多视点@阿达里斯@julielerman破解γDDD课程+@埃里切凡斯0让我走上正轨.讽刺的是,我正在建立一个域名注册系统


F ? lix-A。波旁的@fbourbonnais · 8月11日

γDDDDesign课程由@julielerman@阿达里斯.DDD的关键概念得到了很好的解释.我建议http://owl.li/AcX4q


Geoff Mazeroff@
· 7月30日

我的工作项目使用DDD,所以我喜欢听@阿达里斯@julielerman展示他们的基础知识@小精灵当然。干得好!


麦克·萨斯曼迈克斯斯曼
· 7月25日

完成了@多视点DDD基础课程@julielerman@阿达里斯现在更有意义了.

多元视觉领域驱动设计基础课程

史蒂夫。史密斯我很高兴终于有了我们的领域驱动设计基础课程有多种形式(http://juliel.me/PS-DDD)。这是一个漫长的过程,但我们希望它是正确的。协调我们的时间表变得很棘手,因为我们真的想完全合作,不仅仅是把工作分开缝在一起。

我们也很感激埃里克·埃文,“父亲”DDD,参与课程,让我们采访他,并使用由此产生的视频剪辑,在整个课程中,他提供了深思熟虑和深刻的建议。

这门课已经开了几个星期了,接待也很好。好的评级,在讨论和推特上的反馈让我们为自己的努力感到骄傲。而且,自从它发布几天后,它在整个图书馆的1500门课程中(我相信)排在了前10名(基于过去10天的浏览量)。

如果您没有订阅(但实际上,每月仅29美元)。网站上有10天的免费试用期,我还可以分享30天的免费试用卡。让我们知道你的想法!

形象