.net ef core 领域设计代码转换(上篇)

一、前言

.net core 2.0正式版已经发布几个月了,经过研究,决定把项目转移过来,新手的话可以先看一些官方介绍

传送门:https://docs.microsoft.com/zh-cn/dotnet/core/

由于在领域设计模型上遇到了一些坑,故给大家分享出来自己的一些解决方案。

 

ok,直接上干货,大概结构如下:

.net ef core 领域设计代码转换(上篇)

 比较教科书式的架构。

 

二、领域层

领域实体

.net ef core 领域设计代码转换(上篇)

 

值对象

.net ef core 领域设计代码转换(上篇)

 

规约接口

.net ef core 领域设计代码转换(上篇)

 

工作单元接口

 .net ef core 领域设计代码转换(上篇)

 

仓储接口

.net ef core 领域设计代码转换(上篇)

 

聚合跟划分,我们先建立一个简单的用户实体

.net ef core 领域设计代码转换(上篇).net ef core 领域设计代码转换(上篇)

 

 三、仓储层

引用Microsoft.EntityFrameworkCore.Sqlite 

工作单元ISql接口

.net ef core 领域设计代码转换(上篇)

 

 工作单元IQueryableUnitOfWork接口

 .net ef core 领域设计代码转换(上篇)

 

 接下来是重点了,构造函数的改变:

.net ef core 领域设计代码转换(上篇)

 

OnModelCreating变化:

以前的设置

.net ef core 领域设计代码转换(上篇)

 

 现在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();
  }
}


.net ef core 领域设计代码转换(上篇)

 

关掉所有主外键关系的级联删除


public static void SetOneToManyCascadeDeleteConvention(this ModelBuilder modelBuilder)
{    foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
    }
}


.net ef core 领域设计代码转换(上篇)

 

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);    } }


使用的时候就这样添加,毫无违和感。

.net ef core 领域设计代码转换(上篇)

 

Sql查询的方式改变了一下

.net ef core 领域设计代码转换(上篇)

 

User表仓储实现的时候注意一下构造函数的类型,.net core依赖注入的时候会涉及到这里

.net ef core 领域设计代码转换(上篇)

 

四、应用层

应用层没什么变化,直接贴代码

.net ef core 领域设计代码转换(上篇)

.net ef core 领域设计代码转换(上篇)

 

五、分布式服务层

.net core自带了一个简单的Ioc,所以以前我们用的类似于Unity等框架就可以去掉了

.net ef core 领域设计代码转换(上篇)

Configuration这个是怎么来的呢?

.net core现在建议采用Json等配置文件,用起来非常爽非常强大

.net ef core 领域设计代码转换(上篇)

然后我们需要确保存数据库不存在的时候正确创建

.net ef core 领域设计代码转换(上篇)

 UserController代码:

.net ef core 领域设计代码转换(上篇)

 六:展示层

WPF界面简单弄一下

.net ef core 领域设计代码转换(上篇)

后台代码:

.net ef core 领域设计代码转换(上篇)


原文地址:http://www.cnblogs.com/beefsteak/p/7805853.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.net ef core 领域设计代码转换(上篇)