我正在将工具迁移到 .net 5 控制台应用程序。我想更改我的 DI 系统,目前是 TinyIoC 的修改版本,尽可能使用内置 DI。目前,我的工具将加载并自动注册它在其配置文件中找到的任何 dll。先入胜出,因此我的一个接口的用户提供的实现将优先于我的默认接口,最后加载。
此外,我需要能够注册给定接口的多个变体,并让我的 DI 系统根据配置在它们之间进行选择。目前,这适用于我添加到 Tiny 的 RegistrationName 属性。当 tiny 自动注册 dll 中的所有内容时,它会将这个名称包含在它的注册中。
因此,例如,我有一个IProvider 接口,其方法包括IDbConnection GetConnection(string connectionString);. 我有几个 SQL Server、Postgres 等的默认实现,用户可以在 dll 中提供我在编译我的工具时不知道的其他实现。
这是我声明我的 SQL Server 提供程序的方式...
[RegistrationName("System.Data.SqlClient")]
class SqlClient : IProvider
{
这是我在 qfconfig.json 中指定提供程序的方式...
{
"defaultConnection": "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True",
"provider": "System.Data.SqlClient"
}
以下是我向 Tiny 询问具体实例的方式……
// RegistrationName is passed to the Resolve method.
// Tiny returns the implementation whose RegistrationName matches.
_provider = _tiny.Resolve<IProvider>(config.provider);
所以我想保留这种可能性,但要找到一种不那么个人化的方式。
我担心我在这个问题上误入了森林。我发现的文档和教程都涵盖了更简单的场景,其中有一个接口的注册实现,并且所有内容都在代码中显式注册。有人可以指点我回到路上吗?