我注入(inject)一个通用列表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>
一起使用理解一个更普遍的问题:“如何使用 ServiceCollection
构建跨库边界的对象”?
最佳答案
您可以使用 IServiceCollection
多次注册同一类型。和 ServiceProvider
将自动将所有这些解析为 IEnumerable<>
.
例如,如果您希望图书馆的用户添加自定义 ICommand
他们只需在自己的库中执行以下操作:
serviceCollection.AddSingleton<ICommand, CustomCommand1>();
serviceCollection.AddSingleton<ICommand, CustomCommand2>();
serviceCollection.AddSingleton<ICommand, CustomCommand3>();
ServiceProvider
会自动将它们添加到 IEnumerable<ICommand>
列表中根据要求(跨图书馆边界)。
关于C# 如何跨库边界在 IServiceCollection 中构建集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69650674/