C# 如何跨库边界在 IServiceCollection 中构建集合?

标签 c# .net-core dependency-injection service-provider servicecollection

我注入(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/

相关文章:

c# - 在存储对象中调用方法

c# - 使用 IoC 和 Dependency Injection,如何在不违反 Open-Closed 原则的情况下用新的实现层包装代码?

java - 在不创建 2 个 guice 帮助程序接口(interface)的情况下使用自定义参数注入(inject)变量?

c# - 使用静态工厂是依赖注入(inject)的有效模式吗?

javascript - postman - 在预请求脚本中访问完整的请求主体(以计算哈希)

c# - 缺少 "missing Produce outputs on build"选项

c# - 从 MySQL C# 中的表中获取前 3 名

.net-core - 为什么Curve25519即使参数错误也能正确计算 key 对?

.net - .NET Core 是 .NET Standard 的 "Implementation"吗?

.net - "Reverse-Resolution"带有 Ioc 容器?