繁体   English   中英

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

[英].Net Core DI - multiple instances of the same type

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

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

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

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

  • FilesReader
  • FilesWriter
  • DbReader
  • DbWriter

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

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

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

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

_dbClient = _dbFactory.Get("DatabaseA");

DbWriter将具有:

_dbClient = _dbFactory.Get("DatabaseB");

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

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

 services.AddTransient<IMyService, MyService>();

根据文档

瞬态寿命

如有疑问,请使其瞬态。 这才是真正的原因。 添加临时服务意味着每次请求该服务时,都会创建一个新实例。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM