然后再小小对比了一下Kotlin的Ktorm,这也是一个优秀的ORM,上次我也小小的试用了一下,挺不错的,除了没有迁移功能没法自动建表,这个Ktorm用起来类似EFCore的体验,同样是外键直接引用就行,不用像FreeSQL那样留一个Id字段来保存,各有利弊吧…不展开了
PS:之前的文章里吐槽了Ktorm之后被作者大佬看到找上来手把手指导我写代码了(逃),有些坑真不是框架的问题,还是自己太菜了啊…
数据库数据库我用SQLite,反正小项目我全都用这个,性能好,部署方便,虽然有写入锁,但就几个人在用的系统,要啥自行车?
记一次 SQLite 性能优化 https://www.isaced.com/post-272.html
每天4亿行SQLite订单大数据测试 https://cloud.tencent.com/developer/article/1016993
ViewModelViewModel在分层架构中很重要,其实除了ViewModel还有一个叫DTO(Data Transfer Object)的概念,ViewModel和DTO在MVC架构中同属于Model层,DTO也可以叫做Input Model,因为一般作为外部传入数据的对象(顾名思义嘛),然后通常总是在说的Model,其实也可以叫Entity,这些对象是直接对应到数据库中的表,一般在View或者Api中不直接呈现Model,而是呈现ViewModel,因为可能我们会对要输出的数据做一些处理啦,比如增加字段删除字段这些,用Model肯定不行,数据表都是固定的。
同理,在传入数据的时候,和数据表也不一定重合的,所以需要借助DTO,其实和ViewModel没什么严格的界限,你要拿DTO去呈现也行,只是我觉得ViewModel看名字就是拿来呈现的,习惯哈哈。
其实传统的MVC、MVVM模式都已经有点跟不上时代了,我觉得现在的Web应用就得按照DDD(Domain-Driven Design)模式来设计,不过DDD初学有点复杂,概念很多,我也不好乱解释,引用一下知乎的一段回答:
DDD简单说是: 一个项目里面有多个Bounded Context, 譬如说一个是前台面向用户的,一个是后台面向公司内部人员的。每个Bounded Context里面会分为多个aggregate。每个aggregate里面包含了一堆需要保证事务性一致的物体,也就是说从全局来说,每个aggregate都是当作一个整体。常见的例子就是Order(订单)和OrderLine(订单里面的商品)。Entity包括Aggregate root都有唯一标识。两者的区别是aggregate root全局里面有唯一标识,而aggregate 内部其他entity只是在aggregate内部有唯一标识(也许你数据库里面有主键,但是这边是指概念上来说这个唯一标识对全局来说意义不大,只有在aggregate内部意义才大)。另外的value object就是没有标识的物体,他们的意义就在于它的值,你可以想象成比较两个entity是不是同一个只需要判断ID是否相等,而判断value objects需要看里面的每个属性是否一样。
作者:鲍牙叔
链接:https://www.zhihu.com/question/25256772/answer/77940547
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
然后,这么多对象在转来转去,又有很多字段是差不多的,一个个重新赋值显得很傻也根本没必要,这个时候AutoMapper就要用起来了,具体用法不是本文的讨论范围(参考下方列出的官方文档),不过提一点,AutoMapper是可以配置的,有哪些字段不要的可以排除,我在Profile中是这么写的:
public class VideoProfile : Profile { private readonly List<string> _unmapped = new List<string> { "HostEnvironment", "Previews", "OverallRating" }; public VideoProfile() { CreateMap<Video, VideoViewModel>(); ShouldMapProperty = (property) => !_unmapped.Contains(property.Name); } }把不要的字段放在一个List里面,然后用lambda配置 ShouldMapProperty 就好啦。
参考
AutoMapper https://docs.automapper.org/en/latest/Getting-started.html
RESTful+FreeSql+AutoMapper
FreeSql、AutoMapper处理多对多查询映射 https://blog.csdn.net/XinShun/article/details/104755959
一些关于C#语言的