【问题标题】:Where should I keep my single instance of my database client in database architecture for microservices?在微服务的数据库架构中,我应该将我的数据库客户端的单个实例保存在哪里?
【发布时间】:2021-04-19 06:04:35
【问题描述】:

我有这种分层架构:
客户端用户界面 (exe),
使用 ASP .net web api 处理来自客户端(.net 核心应用)的请求的服务,
应用程序做操作,检查...(.net核心类库),
Models 是一个映射类。 (.net核心类库),
数据库处理的基础设施。 (具有通用存储库的 .net 核心类库)。

在服务层的扩展中,在启动时创建我的数据库的一个实例,然后这个实例被传递到下面的层到应用程序,然后从应用程序传递到基础设施层。 这样做是出于 IoC 的原因并保留我的数据库客户端的单个连接实例。

现在我将我的数据库更改为 MongoDb,我发现自己在保存我的数据库客户端实例的服务层和基础设施中使用的数据库技术之间建立了一些直接依赖关系,然后我需要修改我的基础设施和我的服务,这就是问题。

所以一切都与架构有关,我应该将我的数据库客户端实例保存在顶层还是应该只有基础架构来处理?如果是这样意味着我每次都需要创建新的连接。

希望我足够清楚

【问题讨论】:

  • 每次调用所述客户端将新实例注入到 REST API 控制器的每个服务中会有什么问题?
  • 听起来像:SOLID - 依赖倒置...
  • 嗨 nvoigt,注入新实例的问题是服务层知道用于数据库的技术,我的意思是服务必须创建 MongoClient client = new MongoClient("connectionString") 将其传递给我不想要的基础设施,必须有某种抽象来避免这种依赖。

标签: c# architecture microservices domain-driven-design repository-pattern


【解决方案1】:

您绝对不应该跨层传递数据库对象的该实例。它应该保留在一个单一的层 - 数据层。这就是我的意思:

  • 您应该有一个data layer,其中包含通过上层抽象(接口)建模的类。例如UserProfile 等类,以及setUserNameupdateProfile 等方法。
  • 数据层中的每个类都包含对您的实际数据库客户端(MySQL、MongoDB 等)的引用。该引用可以是单例(这意味着与您的数据库的一个连接)。
  • 业务逻辑中的上层仅取决于数据层的类,它们不知道您的特定数据库服务。更准确地说,它们依赖于数据层暴露的接口
  • 这样,当您想要更改数据库时,您只需更新数据层(因为那里有特定的数据库客户端)。其他图层保持不变。

【讨论】:

  • 好吧,我不明白你所说的数据层是什么意思。它是现有项目(层)内的文件夹吗?如果是这样,那么在哪里?我猜在应用程序中?还是一个单独的层(新项目)?如果是这样,那么它是一个类库,并且......我们不能在非创建应用程序中存储单例。只有一个具体的应用程序,如控制台、winforme、.net web api(正在运行的东西),可以保持单例。唯一的地方是正在运行的服务层,因为其他层只是类库,没有运行以保留一些数据。
  • 它只是应用程序中的一个文件夹(带有类)
  • 好的,但是应用程序是一个类库,它怎么能容纳一个单例或一个数据?它只是被服务调用并将一些参数传递给它上面的一些函数,我不能在上面存储一些东西。也许我误解了一些东西^^感谢Cosmin的回复:)
  • 那么您可能需要对应用程序进行一些架构更改,以避免跨层传递数据库实例的问题。也许为数据管理创建一个专用层(我看到你有Infrastructure for database handling 层)。你不能在那里创建一个单例连接吗?
  • 基础设施也是一个类库,它不能保存单例或任何数据,只有服务在运行并且可以创建一些concreate对象。我想每次请求达到低级别时我都必须创建新连接:s 问题是我需要为 connectionString、数据库读取一些配置文件......这并不意味着要在类库中使用(不包括 appsettings.json在类库中)
猜你喜欢
  • 2014-07-04
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2020-07-25
  • 1970-01-01
相关资源
最近更新 更多