我有.NET
之后的Onion Architecture
解决方案。
根据这种类型的体系结构的指导原则,我的实体所在的Core
层必须是抽象的,并且不能引用任何外部库。
我还想连接到一个MongoDb
数据库,该数据库要求实体的Id
属性的类型应为ObjectId
,这是Mongo类型。
namespace MyApp.Core.Entities.Base
{
using System;
**using MongoDB.Bson;** // This is an external library that should not be referenced by Core
public class BaseEntity
{
public **ObjectId** Id { get; set; }
public DateTime? CreationDate { get; set; }
}
}
因此,如果我将此属性类型添加到Core层中的实体,那意味着我将不得不在Core层中引用MongoDb,这将违反Onion Architecture准则。我想我的解决方案是在Core层之外(这是不可能的)制作某种局部类,在其中我将添加ObjectId属性。
关于如何实现这一目标的任何想法吗?
答案 0 :(得分:0)
“根据这种类型的体系结构的指导原则,我的实体所在的核心层必须是抽象的,并且不能引用任何外部库。
我还想连接到MongoDb数据库,该数据库要求实体的Id属性应为ObjectId类型,这是Mongo类型。”
这给您两个选择:
我总是会建议选择2。始终创建一个“ DatabaseAdapater”类。在整个项目中使用一个实例。如果您需要支持其他DMBS,则非常简单:提取接口/抽象类->编写新的变体->一次更改实例化。
答案 1 :(得分:0)
您需要将基础实体的Id
定义为object
类型。
public class BaseEntity
{
public object Id { get; set; }
public DateTime? CreationDate { get; set; }
}
有了这个,您可以在数据库中拥有任何类型的ID,并且数据库适配器应能够将BaseEntity Id
转换为目标类型。
这不仅可以帮助您保持MongoDb完整的体系结构,而且可以帮助您将来使用的任何DB / ID列类型。
希望这会有所帮助!