摘要: 伴随着 .NET Core 3.0 一起发布的 C# 8 ,从发布至今已经过了快大半年了。如果您细心的话,就能发现在C# 8新增的功能中有一条:“默认接口方法” 。 半年前当我看到这一新特性的时候,我惊呆了,但是惊讶之余是更多的疑惑。因为对于接口这个东西来说,从C#发布至今的十多年里几乎一直保持它的样子,然而在C# 8之后,它有了巨大的变化。随着而来,也是各种争论的声音。 阅读全文
posted @ 2020-02-17 17:22 句幽 阅读(5014) 评论(48) 推荐(41) 编辑
摘要: 对于“ + ”,“ - ”,“ * ”,“ / ”,“ is ”,“ as ” 等C#的运算符可能大家都再熟悉不过了。但是有时候大家在阅读一些网站上的代码或者开源项目的源码时,会遇到一些奇奇怪怪的运算符,特别当几个少见的运算符连在一起的时候,仿佛有一种 “别人的C#和我的C#怎么不一样” 的感觉。随着C#的版本更新,它为我们提供了许许多多的语法糖和新运算符方便我们更流畅的来编写代码。当有时候遇到不认识的运算符,就会本着 “百度不行就谷歌” 的程序员大法来疯狂操作一波。但是!! 搜索引擎他喵的居然不认这些符号。 阅读全文
posted @ 2020-02-14 16:45 句幽 阅读(1881) 评论(14) 推荐(18) 编辑
摘要: 【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。如果您现在正在使用.NetCore的话,相信您对await 和 async这两个关键字再熟悉不过了。它们是为异步编程提供的语法糖,便于我们在代码中更便捷的进行异步操作。await 和 async其实是对Task对象都一层包装操作。而当我们查看Task对象的时候,会发现他有一个叫做 Yield() 的方法。 阅读全文
posted @ 2020-01-24 15:41 句幽 阅读(2423) 评论(7) 推荐(13) 编辑
摘要: 在上一篇文章:《闪电光速拳? .NetCore 中的Span》中我们提到了在.net core 2.x 所新增的一个类型:Span。但是您会发现它无法用在我们项目的某些地方,它独特的 ref结构 使它没有办法跨线程使用、更没有办法使用Lambda表达式。所以,这个时候如果我们又想跨线程操作数据又想获得类似Span这样的性能怎么办呢? 阅读全文
posted @ 2020-01-20 18:13 句幽 阅读(2682) 评论(17) 推荐(34) 编辑
摘要: 在dotnet core2.x之后,引入了一个叫做Span 阅读全文
posted @ 2020-01-17 18:43 句幽 阅读(4832) 评论(24) 推荐(57) 编辑
摘要: 伴随着dotnet core的不断迭代,我们在享受.net性能上的提升之外,还收获了许许多多新出现的API。不知您有没有发现,有这样一个类型在开始逐渐出现在我们的视野中 ———— ValueTask 阅读全文
posted @ 2020-01-13 18:28 句幽 阅读(3713) 评论(8) 推荐(22) 编辑
摘要: IEnumerable**和**IEnumerator**,如果不仔细看,是不是都以为它们是同样的一个单词。特别是我们习惯了每天看大量的中文,这种只是很小区别的单词更是容易犯错。在.NET的世界里好像有这种类似单词的情况还真的不少,比如**Authentication**和**Authorization**(认证和授权)。记得第一次见着它俩的时候,我说怎么看了半天怎么第一部分是它,第二个部分还是它?甚至我一度以为它们是同一个东西。(*关于认证和授权将在后期为大家介绍。*) 阅读全文
posted @ 2020-01-10 18:05 句幽 阅读(1573) 评论(4) 推荐(13) 编辑
摘要: 虽然领域驱动设计的思想很诱人,但我们依然会面临各种隐藏的困难,就比如今天我们要讲的主题“持久化”:即使前期我们设计了足够完整的领域对象,但是依然需要持久化它们到数据库中,而普通的关系型数据库可能很难维持领域对象的原有结构,所以我们必须要使用一些特有的手段来处理它。将值对象持久化成字段好呢?还是将值对象持久化为表好呢?集合的值对象又怎么存呢? 阅读全文
posted @ 2020-01-08 16:29 句幽 阅读(8163) 评论(34) 推荐(47) 编辑
摘要: 【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。您可以在下班坐地铁的时候,拿出手机逛一逛博客园,利用短短的五分钟完成阅读。 阅读全文
posted @ 2020-01-06 18:05 句幽 阅读(2259) 评论(13) 推荐(24) 编辑
摘要: 在上一篇 《如何运用领域驱动设计 - 存储库》 的文章中,我们讲述了有关仓储的概念和使用规范。仓储为聚合提供了持久化到本地的功能,但是在持久化的过程中,有时一个聚合根中的各个领域对象会分散到不同的数据库表里面;又或者是一个用例操作需要操作多个仓储;而这些操作都应该要么同时成功,要么同时失败,因此就需要为这一系列操作提供事务的支持,而事务管理就是由工作单元来提供的。在上一篇中,可能已经提到了工作单元,但是仅仅是一笔带过,现在我们就来详细的探究该如何更好的来实现工作单元。(文章的代码片段都使用的是**C#**,案例项目也是基于 **DotNet Core** 平台)。 阅读全文
posted @ 2020-01-01 17:28 句幽 阅读(5175) 评论(17) 推荐(44) 编辑
摘要: 在上一篇文章中,我们已经了解过领域驱动设计中一个很核心的对象-聚合。在现实场景中,我们往往需要将聚合持久化到某个地方,或者是从某个地方创建出聚合。此时就会使得领域对象与我们的基础架构产生紧密的耦合,那么我们应该怎么隔绝这一层耦合关系,使它们自身的职责界限更加清晰呢?是的,这就要用到我们今天要讲的内容 - 存储库。在很多地方,我们喜欢叫它为仓储,特别是在现有的AspNetCore应用中,大量的应用都在引入Repository这种东西。那么究竟什么是存储库呢?我们现在的使用方式是正确的吗?它在领域驱动设计中又扮演着怎样的角色呢?本文将从不同的角度来带大家重新认识一下“存储库”这个概念。 阅读全文
posted @ 2019-12-25 17:04 句幽 阅读(5637) 评论(42) 推荐(65) 编辑
摘要: [toc] 概述 在前几篇的博文中,我们已经学习到了如何运用实体和值对象。随着我们所在领域的不断深入,领域模型变得逐渐清晰,我们已经建立了足够丰富的实体和值对象。但随着实体和值对象的数量逐渐增多,它们之间的关系也显得越来越复杂:实体A与实体B存在一对一的关系,实体B又与实体C存在一对多的关系。就这样 阅读全文
posted @ 2019-12-18 18:16 句幽 阅读(8714) 评论(36) 推荐(63) 编辑
摘要: 概述 本文将介绍领域驱动设计(DDD)战术模式中另一个非常重要的概念 - 领域服务。在前面两篇博文中,我们已经学习到了什么是值对象和实体,并且能够比较清晰的定位它们自身的行为。但是在某些时候,你会发现某一些业务行为好像不容易落到单个实体或者值对象身上,并且会为放置这一部分业务逻辑而困惑。此时,你可能 阅读全文
posted @ 2019-12-11 17:30 句幽 阅读(9819) 评论(51) 推荐(44) 编辑
摘要: 本文将介绍领域驱动设计(DDD)战术模式中另一个常见且非常重要的概念 - 实体。相对战术模式中其他的一些概念(例如 值对象、领域服务等)来说,实体应该比较容易让人理解和运用。但是我们如何去发现所在领域中的实体呢?如何保证建立的实体是富含行为的?实体运用时又有那些注意的细节呢?本文将从不同的角度来带大家重新认识一下“实体”这个概念,并且给出相应的代码片段 阅读全文
posted @ 2019-12-04 17:34 句幽 阅读(7611) 评论(37) 推荐(34) 编辑
摘要: 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象。一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一。但是在学习过程中,大家会因为受到传统开发模式的影响,往往很难去运用值对象这一概念,以及在对值对象进行持久化时感到非常的迷惑。本篇文章会从值对象的概念出发,解释什么是值对象以 阅读全文
posted @ 2019-11-28 18:05 句幽 阅读(9887) 评论(31) 推荐(55) 编辑