.Net Core DI-相同类型的多个实例

时间:2019-07-19 07:10:33

标签: c# .net dependency-injection .net-core inversion-of-control

首先,我看到了一些类似于我的话题,但是我认为它们并不能真正回答我的问题。

我正在创建一个应用程序,该应用程序可以根据配置在多种模式下工作。该应用程序是从数据库到文件的简单数据导入/导出。它实际上可以传输数据:

  • 文件与数据库之间
  • 在数据库和另一个数据库之间

第一种情况没有问题,第二种情况有问题。我的应用程序具有以下类:

  • FilesReader
  • FilesWriter
  • DbReader
  • DbWriter

我认为您可以看到如何将它们连接在一起以从一个来源读取并写入另一个来源。当我想同时使用DbReaderDbWriter时出现问题。由于他们两个都需要在构造函数中使用IDbClient,因此我需要一种方法可以将它们的不同实例传递给他们(因为DbReader将从数据库A中读取,而DbWriter将写入数据库中B)。 实际上,我实际上有更多需要IDbClient的类。例如,我有DbDataCache,它将需要IDbClient的实例才能与数据库A连接,依此类推。

我认为有几种方法可以实现。但是,我真的不喜欢其中任何一个。这是我的想法:

  1. 在将每个类注册到容器时,我可以“手动”注册它们-创建每个IDbClient,创建依赖于它的每个类并将正确的实例传递给它们-我不喜欢它,因为我失去了注册的便利性,因此变得相当复杂,并且大量使用new关键字。

  2. 我可以创建一个DbClientFactory并使用某些名称(例如IDbClientDatabaseA)注册DatabaseB实例-我不喜欢它,因为现在,需要IDbClient的类将需要知道他们需要的名称。 因此,DbReader可能需要在其构造函数中有这样的想法

_dbClient = _dbFactory.Get("DatabaseA");

DbWriter将具有:

_dbClient = _dbFactory.Get("DatabaseB");

您怎么看?也许有一些其他的DI容器比.Net Core内置容器更适合我的需求?

2 个答案:

答案 0 :(得分:0)

根据我对您的解释,我的理解是:您的解决方案是在对DI Container的每个请求中提供新的IDbClient实例。如果是这样,请尝试将您的服务注册为Transient

 services.AddTransient<IMyService, MyService>();

根据文档

瞬态寿命

如有疑问,请使其瞬变。确实是这样。添加临时服务意味着每次请求该服务时,都会创建一个新实例。

答案 1 :(得分:0)

我将使用与.NET Core本身中的记录器相同的方法。因此,通常不用注册DI单独的记录器,而通常注册ILoggerFactory,然后将其注入必要的类并使用CreateLogger(name)函数创建一个记录器。

因此,与日志记录类似,您可以在DI中注册IDbClientFactory的某些实现,将其注入所需的位置,然后调用诸如dbClientFactory.CreateReader(dbName1)dbClientFactory.CreateWriter(dbName2)之类的东西来创建实际的读取器或写入器。

有趣的事情。大约两周前,我们发布了.NET Core global tool,它执行相同的任务:将数据从某些常见格式(JSON,XML)导入和导出到DB,反之亦然。该工具本身和基础库都是完全开源的,published on GitHub。因此,如果发现有用的东西,请随时在您自己的项目中使用该代码。