我正在嘗試使用 Entity Framework Core 實作基于 DDD 的通用物體。我有 2 個獨立的資料庫,外部和內部,它們在某些地方共享通用表模型和邏輯。我試圖以這種方式實作它:
public abstract class EmployeeBase
{
public Guid Id {get;}
public string Name {get; protected set;}
public Guid DepartmentId {get; protected set;}
public DeparmentBase {get; protected set;}
public void DomainMethod1() {...}
public void DomainMethod2() {...}
}
public class InternalEmployee : EmployeeBase
{
}
public class ExternalEmployee : EmployeeBase
{
}
public abstract class DepartmentBase
{
public Guid Id {get;}
public string Name {get; protected set;}
public ICollection<EmployeeBase> Employees {get; protected set;}
public void DomainMethod1() {...}
public void DomainMethod2() {...}
}
public class InternalDepartment : DepartmentBase
{
}
public class ExternalDepartment : DepartmentBase
{
}
甚至可以在物體框架核心中做到這一點嗎?我找不到使用 FluentAPI 配置它的方法。任何人都可以幫忙嗎?我也不確定在具有抽象型別的嵌套屬性的抽象類中實作域邏輯是否是一個好主意。有沒有更好的選擇?提前謝謝你!ent
uj5u.com熱心網友回復:
甚至可以在物體框架核心中做到這一點嗎?
是的,檔案在這里: https ://docs.microsoft.com/en-us/ef/core/modeling/inheritance
我也不確定在具有抽象型別的嵌套屬性的抽象類中實作域邏輯是否是一個好主意。有沒有更好的選擇?
您將 DDD 物體(域模型)與 EF 物體(持久性模型)混淆了。
在具有嵌套抽象屬性的抽象類中實作域邏輯不是問題。問題是在 EF 模型中執行此操作,因為它對物件關系映射施加了很大壓力,尤其是在您有兩個后端資料庫的情況下。
ORM(例如 EF 核心)所做的是將物件上的操作轉換為關系世界,反之亦然。它們通常在內部使用盡可能少的邏輯來操作 POCO 物件,因為它們是符號:它們在物件世界中代表資料庫概念,例如表、行、列、索引等......
如果您的應用程式是使用域優先方法設計的,那么您可以使用相同的業務持久性模型。在這種情況下,ORM 只負責按原樣保存域狀態,并且資料庫結構遵循域模型的設計。但是,此模型可能會變得非常復雜,因為它必須對業務邏輯進行建模并尊重資料庫設計的良好實踐。僅當您的商業模式微不足道時才有效。
在這里,您對資料庫結構(兩個資料庫)和一個復雜的域模型(具有抽象/多型性)有限制,因此您不能隨意使用持久層一個簡單的“保存我的域狀態”庫。您應該將您的關注點分成不同的模型:
- 每個資料庫一個持久性模型,POCO 貧乏,沒有抽象類或屬性
- 一個具有抽象類和屬性的領域模型,實作您的領域邏輯
然后,您可以使用存盤庫模式在模型之間實作配接器:
- https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design
- https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-implementation-entity-framework-core
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/448780.html
下一篇:下面函式的空間復雜度
