C# 如何跨库边界在 IServiceCollection 中建立集合?
C# How do you build up a collection in the IServiceCollection across library boundaries?
我通过构造函数注入一个通用列表 List<ICommand>
。我的库的用户应该能够添加他们自己的 ICommand
实现。所有 ICommand
实现在编译时都是已知的。目前,我向 ServiceCollection
添加了如下内容(我知道还有其他方法可以做到这一点):
ServiceCollection.AddSingleton<List<ICommand>>>(new List<ICommand>()
{
new Command1(),
new Command2(),
new etc....
});
这适用于添加当前库中定义的 ICommand
实现。但是,我希望其他人使用我的库并添加他们自己的 ICommand
实现。他们如何从该图书馆外部将自己的 ICommand
添加到此 List<ICommand>
?
我将这个具体示例与 List<T>
结合使用来理解一个更普遍的问题:“你如何构建一个对象 ACROSS 库边界使用 ServiceCollection
"?
您可以使用 IServiceCollection
多次注册同一类型,并且 ServiceProvider
将 自动 将它们全部解析为 IEnumerable<>
.
例如,如果您希望图书馆的用户添加自定义 ICommand
对象,他们只需在自己的图书馆中执行以下操作:
serviceCollection.AddSingleton<ICommand, CustomCommand1>();
serviceCollection.AddSingleton<ICommand, CustomCommand2>();
serviceCollection.AddSingleton<ICommand, CustomCommand3>();
ServiceProvider
会自动将它们添加到请求的 IEnumerable<ICommand>
列表中(跨越图书馆边界)。
我通过构造函数注入一个通用列表 List<ICommand>
。我的库的用户应该能够添加他们自己的 ICommand
实现。所有 ICommand
实现在编译时都是已知的。目前,我向 ServiceCollection
添加了如下内容(我知道还有其他方法可以做到这一点):
ServiceCollection.AddSingleton<List<ICommand>>>(new List<ICommand>()
{
new Command1(),
new Command2(),
new etc....
});
这适用于添加当前库中定义的 ICommand
实现。但是,我希望其他人使用我的库并添加他们自己的 ICommand
实现。他们如何从该图书馆外部将自己的 ICommand
添加到此 List<ICommand>
?
我将这个具体示例与 List<T>
结合使用来理解一个更普遍的问题:“你如何构建一个对象 ACROSS 库边界使用 ServiceCollection
"?
您可以使用 IServiceCollection
多次注册同一类型,并且 ServiceProvider
将 自动 将它们全部解析为 IEnumerable<>
.
例如,如果您希望图书馆的用户添加自定义 ICommand
对象,他们只需在自己的图书馆中执行以下操作:
serviceCollection.AddSingleton<ICommand, CustomCommand1>();
serviceCollection.AddSingleton<ICommand, CustomCommand2>();
serviceCollection.AddSingleton<ICommand, CustomCommand3>();
ServiceProvider
会自动将它们添加到请求的 IEnumerable<ICommand>
列表中(跨越图书馆边界)。