为什么要写这篇文章 1,在大半年前,公司开发任务比较轻松,自己不知道干什么,但是又想要学习技术,比较迷茫,后面我接触到了博客园,看了一个帖子,深有感触,我当时不知道学习什么,于是我信息给他,他居然回复我了...2,在一次面试中,有人问我,你工作1年多了有没有做过自我总结,你觉得你的优势是什么,我当时吞吞吐吐的回答了,内心十分的慌张,在此补上总结。...应用层 应用层使用的相关知识:AutoMapper,Dto,Autofac依赖注入 一,Dto:数据传输对象,主要是展现层和应用层传输数据 二,AutoMapper:对象之间传输数据,先使用仓储查询出数据...展现层 一,展现层使用的相关知识:.Net Core WebApi ,MVC,JWT Swagger,日志异常的捕捉,模型的验证,Log4Net,Autofac依赖注入,过滤器 二,JWT:JWT包含了使用...来请求WebApi ,以及查看WebApi 接口,Swagger可以做接口文档 四,Log4Net:日志异常的全局捕捉,记录日志到TXT中 五,过滤器:使用过滤器来进行模型的验证 ,Log4Net的日志异常的全局捕捉
在框架生成的 Program 类文件中,在配置 IWebHostBuilder 的过程时,框架默认为我们添加了一些服务,当然,这里你可以注释掉默认的写法,去自己创建一个 WebHostBuilder 对象...在重新生成项目的过程中,你会发现,错误列表会显示很多警告信息,提示我们一些方法没有添加 XML 注释。...这里,因为我会在 Grapefruit.Application 类库中创建各种的 Dto 对象,而接口中是会调用到这些 Dto 对象的。...); }); 当我们添加好路由规则定义后,我们在 Area 的 Controllers 文件夹下添加一个 WebAPI Controller。...当我们设置为 true 时,API 会在响应的 header 中返回版本信息。
添加实体模型 在WebAPI项目中添加Models目录,并增加 Book 实体类: public class Book : MongoDocBase { [BsonElement("Name")...UpdatedDate { get; set; } } 需要注意的是:MongoDB存储时间类型数据时,都是先转换为UTC时间,然后存储到数据库中。当我们取出存储的时间时,就会出现时差的问题。...因此,一般我们会给文档中的日期类型加上如下所示的注解,将它转换为本地时间传输: [BsonDateTimeOptions(Kind = DateTimeKind.Local)] 在实际应用中,我们会给实体类创建一些...DTO,然后在应用层进行DTO向DO的转换。...首先,在appSettings.json中添加以下数据库配置: { ......
DDD反模式 在最佳实践和设计模式的反面,有一些DDD的味道是架构师和开发人员在实现域模型时应该注意的。...数据库层以内存对象/数据网格的形式从域层抽象出来。 缓存 当我们讨论域层的状态(数据)时,我们必须讨论缓存的方面。频繁访问的域数据(如按揭贷款处理应用程序中的产品和利率)是很好的缓存候选者。...数据传输对象 DTO也是SOA环境中设计的一个重要部分,在SOA环境中,域对象模型在结构上与从业务服务接收和发送的消息不兼容。...当涉及到在域层中编写委托类时,我看到开发人员手动编写这些类(主要是从头开始编写第一个类,然后按照“复制和粘贴”模式为其他域对象创建所需的委托类。...当我对项目进行设计和代码评审时,我依赖JDepend、Classycle和Metrics等插件来评估应用程序中域和其他模块的质量。
需求变更响应缓慢:在大型的系统或产品中,当需要增加功能或修改现有功能时,因为代码架构的随意性,可能会出现改了功能可能会影响到其他的功能,造成系统极不稳定。...当然在 DDD 中,为了更好的将领域模型反应需求,对类、类的属性、类之间的关系等有一些模式的指导。...一是技术维度,有业务代码的实现、有与数据库或其他持久化存储交互的实现、有消息队列的实现、有身份验证与授权的实现、有 WebAPI 暴露的实现等;二是业务维度,有太多的模块和功能需要去做;三是时间维度,需要快速的开发...在当前界限上下文中的领域层、仓储实现层、应用服务层、接口层都与其他界限上下文独立开来,这样可以专注开发,并且在修改代码与发布产品时,影响面较小。 c. 时间维度:通过敏捷式迭代快速验证,快速修正。...1.在WebApi项目中引入Nuget包:Swashbuckle.AspNetCore。 2.在WebApi项目属性的生成中,勾选“XML 文档文件”。此目的是可以包括WebApi中每个接口的注释。
在创建 token 或是验证 token 时,像 token 的颁发者、接收者之类的信息,因为会存在多个地方调用的可能性,这里我将这些信息存放在了配置文件中,后面当我们需要使用的时候,只需要通过注入 IConfiguration...这里我采用是当我们停用 token 信息时,将停用的 token 信息添加到 Redis 缓存中,之后,在用户请求时判断这个 token 是不是存在于 Redis 中即可。 ...如果你和我一样,采用这个组件,你需要在 Grapefruit.Application 这个类库中通过 Nuget 添加微软的分布式缓存抽象接口 dll 的引用,以及在 Grapefruit.WebApi...在这个类中,你可以定义一些属性,通过有参构造函数的方式进行构造,这里我不定义任何的属性,仅是创建这个类。...在中间件进行 Jwt 验证的过程中,会验证授权方式是不是 Bearer 以及通过 token 的属性解密之后与生成时用户数据进行比对,从而判断这个 token 是否有效。
使用数据注解(Optional): 可以使用数据注解来为模型类提供更多的信息,例如数据验证、显示名称等。...这样,你就创建了一个简单的数据模型,并可以选择性地将其映射到数据库中。在Web API中使用这个数据模型,可以在控制器中操作它,例如获取、创建、更新和删除数据。...通常,DTO类应该只包含那些在传输时需要的属性,而不是整个实体模型。...在控制器中使用DTOs: 在你的控制器中使用DTO类来处理传入和传出的数据。通常,在API端点的参数中使用DTO类来接收客户端的数据,同时在返回结果中使用DTO类来传递数据给客户端。...4.3 数据模型验证 在ASP.NET Core Web API中,你可以使用数据注解(Data Annotations)和 Fluent Validation 等方式对数据模型进行验证。
那如何才能实现API职责单一,需要我们在定义接口时能够准确识别出接口之间的关联性和边界,对于API如何划分可以通过以下角度: 按照业务主体划分,不一样的业务主体采用不一样的接口类 查询类和修改类的接口分离...(除非是对业务模型有较大的调整),另外要说明的是,内部逻辑的业务数据模型(POJO类)和API数据模型(DTO)有时候出现差异,否则可能需要消费者理解服务的业务模型才能正确的使用接口,这就要求在API设计中开发人员需要明确应该提供哪些数据模型给消费者...良好的注释 注释应该包含哪些;接口的使用场景,参数的说明,在接口类说明中可以给出接口文档链接地址,方便调用方查看 参数的说明;包含参数代表的含义,参数的类型按照Javadoc link规范,参数是否为空...类复用噩梦 在单一参数类结构下,我经常看到多个存在明显功能差异的接口频繁复用一个结构体,甚至接口参数和返回值都复用一个DTO,为了保证兼容,又不得不在同一个DTO内不断加字段,久而久之维护成本持续增高,...兼容性 接口逻辑或者参数变更时,需要对旧的接口保持兼容,这个是API变更时一定要遵守的原则之一,而且要通过接口测试来验证兼容性。
在本文中,我们将讨论模型本身以及相应的.NET接口。 我想先定义一些术语,这些术语在其他文章中可能有更精确的定义,但对于我们来说这些已经足够了。...不过,在使用代码生成工具生成DTO时,通常会使用一些简单的接口(如INotifyPropertyChanged)。 对象图(Object Graph) 一个对象图由一个对象和所有可触及的子对象组成。...在讨论数据模型和DTO时,我们所说的对象图都是单向树状结构(循环图是存在的,但它们会对序列化框架造成影响)。 领域模型(Domain Model) 领域模型是描述一组相关数据模型的更高级概念。...即使在编译时使用IRepository接口来“解耦”类,也无法消除与外部依赖的关系。 在判断什么是数据模型时,要小心那些“存活实体”。...我们可以借此做一些有趣的事情,比如在后台进程中更新模型或者在多个视图之间共享模型。 实现属性变更通知最简单的办法是每次在调用属性设置器时触发它们。虽然从技术方面看是可行的,但仍有一些性能方面的影响。
更简单的解释: contentType: 告诉服务器,我要发什么类型的数据。 dataType:告诉服务器,我要想什么类型的数据。 在http 请求中,get 和 post 是最常用的。...键值对这样组织在一般的情况下是没有什么问题的,这里说的一般是,不带嵌套类型JSON,也就是 简单的JSON,形如这样: {a:1,b:2,c:3} 但是在一些复杂的情况下就有问题了。...3、ASP.NET WebAPI中FromUri和FromBody两类特性区别 1)、【FromUri】特性 应用【FromUri】特性,Web API Action中参数将从URL中解析数据。...在默认情况下POST请求采用JQueryMvcFormUrlEncodedFormatter来解析数据的,JQueryMvcFormUrlEncodedFormatter类通过模型绑定系统利用值提供程序从...URL中读取数据,这里的值提供程序是NameValuePairsValueProvider类,该类实现IValueProvider接口来获取键值对中的数据。
这样随着SOA接口的不断增加,显示端直接将调用服务的方法嵌入到显示逻辑中,如,ASP.NET Mvc、ASP.NET Webapi的控制器中,包括两个层面之间的DTO转换。...(我之前的上一家公司(美国知名的电子商务平台),他们的显示端有着复杂的领域逻辑,就光一个显示端就复杂的让人吃惊,如果能在此基础上引入领域模型显示端上下文,将对复杂的逻辑处理很有好好处,当然这只是我未经验证的猜测而已...在ASP.NETWEBAPI中,我们基本上将显示逻辑都写在这里面,我也将使用此方式来演示本章例子,但是如果你的MVC项目和WEBAPI项目共用显示逻辑就需要将其提出来形成独立的项目(Show Logic...我们这里仅仅是在转换一些DTO对象而不是复杂的DomainModel对象。...,每当我们发生某个业务动作时只管触发事件即可,当然主要是以发送数据为主,查询可以直接调用对象的方法。
DTO: Data Transfer Object. 通常是在 OpenApi . 即此项目与其他外界项目交互时使用的对象....在Spring Boot应用程序中,数据传输对象(DTO)最常用于表示业务模型对象或从应用程序或其服务端点传递的数据模型对象。DTO将这些模型对象中的数据转换为一种便于传输和有效处理的格式。...通过将某些模型对象属性的转换或计算封装到DTO中,可以抽象化服务端点之间的数据处理逻辑。 最终,提供一个整体的清晰,不分双方,简单的数据传输结构。 同样,DTO在优化性能方面也起到了很大的作用。...通过这些注释,可以自动化DTO中的许多任务,这有效地简化了DTO的创建和维护。...序列化支持:DTO需要支持序列化和反序列化,以便它们可以在应用程序各个层之间进行传输。 Bean验证注解:DTO可以包含Bean验证注解,用于在传输数据之前验证数据的完整性。
Core 自定义配置源从远程API读取配置(ConfigurationProvider) 迈向现代化的 .Net 配置指北(配置到类自动映射) 路由、模型绑定 ASP.NET Core WebAPI中...Core 中的模型绑定 ASP.NET Core 中的自定义模型绑定(IModelBinder) ASP.NET Core 中的 URL 重写中间件 依赖注入(IOC、DI) 什么是控制反转,和依赖注入...: 控制反转的意思就是:平常我们需要一个类对象的时候需要new出来,而现在我们把new一个类对象的工作交给了IOC容器,当我们需要一个类对象的时候直接向IOC容器要,就可以了,这个就是控制反转。...(控制权交个了IOC容器) 依赖注入的意思就是:当我需要一个类对象,IOC容器给我们这个类对象的过程其实就是依赖注入,依赖注入有构造函数注入和属性注入。...、缓存、依赖关系注入 ASP.NET Core 中的会话和应用状态 #、session ASP.NET Core 在通用数据保护条例规则下使用 session ASP.NET Core 使用Redis存储
在Java上构建 包含多个层的大型应用程序需要域、持久性和数据传输对象 (DTO) 等模型。应用程序通常由不同但相似的对象模型组成,其中数据可能相似但结构和目标不同。...); if (result.isFalse()) { // 在模型上做一些没有验证的事情 } 地图 要使用 dOOv 将对象与其他对象映射,您将编写代码为: MappingRegistry 映射...测试验证规则 断言在 doov-assertions jar 中可用。...私有字符串类型; //构造函数、getter、setter等 } 这两个类几乎相同,只是座位数的属性具有不同的名称,并且 Car 类中的枚举类型属性是 DTO 中的纯字符串。...如果您想避免在将数据从一个 bean 复制到另一个 bean 时使用不必要的代码,Dozer 是理想的选择。它不仅支持 bean 的映射,还可以自动转换数据类型以映射类与 DTO。
别告诉我快捷键不好用 更换 IDE 不在我本文的重点内容中,所以不想用太多的篇幅去写为什么更换IDE。在这里,我只能告诉你,更换 IDE 只为了更好、更快的写好 Java 代码。原因略。...场景 比如添加会员操作,由于用于演示,我只考虑用户的一些简单数据,当后台管理员点击添加用户时,只需要传过来用户的姓名和年龄就可以了,后端接受到数据后,将添加创建时间和更新时间和默认密码三个字段,然后保存数据库...为什么要验证 很多人会告诉我,如果这些 API 是提供给前端进行调用的,前端都会进行验证啊,你为什还要验证?...其实答案是这样的,我从不相信任何调用我 API 或者方法的人,比如前端验证失败了,或者某些人通过一些特殊的渠道(比如 Charles 进行抓包),直接将数据传入到我的 API,那我仍然进行正常的业务逻辑处理...我希望写一些网上很难查到,或者很少人进行说明的 lombok 的使用以及在使用时程序语义上的说明。
别告诉我快捷键不好用 更换IDE不在我本文的重点内容中,所以不下想用太多的篇幅去写为什么更换IDE,请谷歌。 在这里,我只能告诉你,更换IDE只为了更好、更快的写好java代码。原因略。...场景 比如添加会员操作,由于用于演示,我只考虑用户的一些简单数据,当后台管理员点击添加用户时,只需要传过来用户的姓名和年龄就可以了,后端接受到数据后,将添加创建时间和更新时间和默认密码三个字段,然后保存数据库...为什么要验证 很多人会告诉我,如果这些api是提供给前端进行调用的,前端都会进行验证啊,你为什还要验证?...其实答案是这样的,我从不相信任何调用我api或者方法的人,比如前端验证失败了,或者某些人通过一些特殊的渠道(比如Charles进行抓包),直接将数据传入到我的api,那我仍然进行正常的业务逻辑处理,那么就有可能产生脏数据...我希望写一些网上很难查到,或者很少人进行说明的lombok的使用以及在使用时程序语义上的说明。
,当我们讨论跨平台的服务的时候,虽然WCF对WebService的支持还行,在面对一些高级应用的不太好,微软重新发展了ASP.NET WebAPI框架,关于这两个框架的讨论可以看我另外一篇文章《WCF和...在讨论跨平台的Web服务上,ASP.NET Web API是一个重要选项,在本文中,我将展示如何利用 ServiceStack (开放源代码.NET 和Mono REST 服务框架) 来完成这一任务,不用离开...业务层通常是业务逻辑 数据层是为了封装数据访问和操纵在业务层提供抽象的数据模型。...Web服务通常有远程过程调用(RPC)和RESTful (HTTP)两类,现在占据主导地位的Web服务是RESTful (HTTP),具体内容可以参看文章《REST在企业中获得成功了么?》...本文假定您有一些熟悉 WCF 和.NET 框架。 为了更好地展示WCF 概念可以如何转化为 ServiceStack 的概念,首先会在WCF中实现服务层。
领取专属 10元无门槛券
手把手带您无忧上云