从其他程序集向类添加属性

时间:2018-10-16 15:12:25

标签: c# mongodb oop n-tier-architecture onion-architecture

我有.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属性。

关于如何实现这一目标的任何想法吗?

2 个答案:

答案 0 :(得分:0)

“根据这种类型的体系结构的指导原则,我的实体所在的核心层必须是抽象的,并且不能引用任何外部库。

我还想连接到MongoDb数据库,该数据库要求实体的Id属性应为ObjectId类型,这是Mongo类型。”

这给您两个选择:

  1. 在这种情况下,请忽略规则。也许您可以使用泛型做某事。
  2. 使数据库适配器类不属于核心库。

我总是会建议选择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列类型。

希望这会有所帮助!