【问题标题】:Adding a property to a class from a different assembly将属性添加到来自不同程序集的类
【发布时间】:2019-03-21 04:16:18
【问题描述】:

我有遵循Onion Architecture.NET 解决方案。

根据这种架构的指导方针,我的实体所在的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; }
  }
}

因此,如果我将此属性类型添加到核心层中的实体,这意味着我将不得不在核心层中引用 MongoDb,这将违反 Onion 架构指南。我想我的解决方案是在核心层之外创建某种部分类(这是不可能的),我将在其中添加我的 ObjectId 属性。

知道我该如何做到这一点吗?

【问题讨论】:

  • "我还想连接一个 MongoDb 数据库,它要求实体的 Id 属性应该是 ObjectId 类型,它是 Mongo 类型。"那么数据库适配器类不是核心元素。否则,您将无法无视那一次的规则。我个人更喜欢前者。养成制作专门的数据库交互类的习惯。使它们成为您传递的单个实例。这样切换到 anotehr 后端 DBMS 很容易。
  • 数据库适配器不是核心元素,它实际上是在基础设施层。但它将使用来自核心层的实体。

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


【解决方案1】:

您需要将基本实体的Id 定义为object 类型。

public class BaseEntity
  {
     public object Id { get; set; }
     public DateTime? CreationDate { get; set; }
  }

这样,您可以在 DB 中拥有任何类型的 Id,并且您的 DB 适配器应该能够将 BaseEntity Id 转换为目标类型。

这不仅可以帮助您使用 MongoDb 保持架构完整,还可以帮助您在将来使用任何 DB/ID 列类型。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    “根据这种架构的指导方针,我的实体所在的核心层必须是抽象的,并且不引用任何外部库。

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

    这给你两个选择:

    1. 在这种情况下忽略规则。也许你可以用泛型做一些事情。
    2. 创建一个不属于核心库的数据库适配器类。

    选项 2 是我一直建议的。始终创建一个“DatabaseAdapter”类。在整个项目中使用一个实例。如果您需要支持不同的 DMBS,它很简单:提取接口/抽象类 -> 编写一个新的变体 -> 在某一点更改实例化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 2012-06-29
      • 1970-01-01
      • 2016-06-12
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多