我想将现有 .NET 项目迁移到 Clean Architecture 模型,但当前 EF Core 实体正在使用 HierarchyId 数据类型(来自 EntityFrameworkCore.SqlServer.HierarchyId 包)。
此类型提供的功能即使作为域实体也很有用(例如树中节点的路径、GetLevel() 方法等)
如果核心项目不依赖 EF Core,我该如何处理这个问题?
您可以在域层中创建您自己的分层数据的简化表示,而不是重新实现 HierarchyId 数据类型的整个功能。这可以通过定义封装与应用程序相关的分层信息的自定义类型或类来实现。
例如,您可以定义一个
HierarchyNode
类,其中包含 Id
、ParentId
和 Level
等属性,这些属性表示数据的层次结构。这是如何实现此类的基本示例:
public class HierarchyNode
{
public int Id { get; set; }
public int? ParentId { get; set; }
public int Level { get; set; }
// additional properties
}
接下来,在与数据库交互时,您需要在
HierarchyNode
类和 HierarchyId 数据类型之间进行映射。这可以使用基础设施层内的映射方法或实用程序来完成。例如,从数据库检索数据时,您可以将 HierarchyId 值映射到 HierarchyNode
类的实例,存储数据时反之亦然。
以下是如何在自定义类型和 HierarchyId 数据类型之间执行映射的简化示例:
public static class HierarchyMapper
{
public static HierarchyNode MapFromHierarchyId(HierarchyId hierarchyId)
{
// Implement logic to map HierarchyId to HierarchyNode
// Example:
return new HierarchyNode
{
Id = hierarchyId.Value,
ParentId = hierarchyId.GetAncestor().Value,
Level = hierarchyId.GetLevel()
};
}
public static HierarchyId MapToHierarchyId(HierarchyNode node)
{
return HierarchyId.Parse($"/{node.Id}/");
}
}
使用这些映射方法,您可以将分层数据无缝集成到 Clean Architecture 项目中,而无需直接操作域层中的 HierarchyId 数据类型。
我希望这为实现您自己的类型和 HierarchyId 数据类型之间的映射提供了一个有用的起点。如果您还有任何疑问或需要澄清,请随时询问。