.net ef core 领域设计代码转换(上篇)
一、前言
.net core 2.0正式版已经发布几个月了,经过研究,决定把项目转移过来,新手的话可以先看一些官方介绍
传送门:https://docs.microsoft.com/zh-cn/dotnet/core/
由于在领域设计模型上遇到了一些坑,故给大家分享出来自己的一些解决方案。
ok,直接上干货,大概结构如下:
比较教科书式的架构。
二、领域层
领域实体
值对象
规约接口
工作单元接口
仓储接口
聚合跟划分,我们先建立一个简单的用户实体
三、仓储层
引用Microsoft.EntityFrameworkCore.Sqlite
工作单元ISql接口
工作单元IQueryableUnitOfWork接口
接下来是重点了,构造函数的改变:
OnModelCreating变化:
以前的设置
现在ef core里面没有提供这么方便的封装,需要自己去实现
数据库表名更改:
public static void SetSimpleUnderscoreTableNameConvention(this ModelBuilder modelBuilder) { foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes()) { Regex underscoreRegex = new Regex(@"((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)"); entity.Relational().TableName = underscoreRegex.Replace(entity.DisplayName(), @"$1$2").ToLower(); } }
关掉所有主外键关系的级联删除
public static void SetOneToManyCascadeDeleteConvention(this ModelBuilder modelBuilder) { foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) { relationship.DeleteBehavior = DeleteBehavior.Restrict; } }
Fluent Api 配置
public abstract class EntityTypeConfiguration<TEntity> where TEntity : class { public abstract void Map(EntityTypeBuilder<TEntity> builder); }
public static void AddConfiguration<TEntity>(this ModelBuilder modelBuilder, EntityTypeConfiguration<TEntity> configuration) where TEntity : class { configuration.Map(modelBuilder.Entity<TEntity>()); }
public class UserEntityTypeConfiguration : EntityTypeConfiguration<User> { public override void Map(EntityTypeBuilder<User> builder) { builder.HasKey(u => u.Id); } }
使用的时候就这样添加,毫无违和感。
Sql查询的方式改变了一下
User表仓储实现的时候注意一下构造函数的类型,.net core依赖注入的时候会涉及到这里
四、应用层
应用层没什么变化,直接贴代码
五、分布式服务层
.net core自带了一个简单的Ioc,所以以前我们用的类似于Unity等框架就可以去掉了
Configuration这个是怎么来的呢?
.net core现在建议采用Json等配置文件,用起来非常爽非常强大
然后我们需要确保存数据库不存在的时候正确创建
UserController代码:
六:展示层
WPF界面简单弄一下
后台代码:
作者:
牛排大叔
出处: http://www.cnblogs.com/beefsteak/ 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请联系我
出处: http://www.cnblogs.com/beefsteak/ 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请联系我