1. 程式人生 > >.net ef core 領域設計代碼轉換(上篇)

.net ef core 領域設計代碼轉換(上篇)

解決 con mage keys $1 服務 結構 刪除 sql

一、前言

.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界面簡單弄一下

技術分享

後臺代碼:

技術分享

.net ef core 領域設計代碼轉換(上篇)