c# - Simple Injector 使用元数据注册多种类型的相同接口(interface)

标签 c# .net dependency-injection simple-injector

我有以下问题。我有一个接口(interface) IFoo 和它的多个实现。现在,我有一个 Web API Controller ,根据某些情况,它应该创建一种特定类型的 IFoo 后代,调用它的方法并返回结果。无论我使用哪种 IFoo 实现, Controller 的逻辑都不会改变。对于这个任务,我需要告诉容器从 Controller 创建哪个 IFoo 实现,问题是,我不知道该怎么做(如果使用 Simple Injector 甚至可能的话)。

附言我已经考虑过 RegisterAll,但在这种情况下,当我只需要一个时,我不得不创建所有 IFoo 后代(并将其传递给 Controller ​​)​​。这不是我的解决方案。

另一种解决方案是为不同的 IFoo 实现创建不同的 Controller 并使用基于上下文的注入(inject),但这会导致我想要避免的重复代码/ Controller 。

理想情况下,解决方案应该是这样的

container.RegisterAllWithMetadata(IEnumerable<Type> types, IEnumerable<string> metadata)
container.GetInstance(Type type, string metadata)

是否可以使用 Simple Injector 实现我的目标?

最佳答案

很抱歉让它恢复生机,但正如 Steven 在评论中所说,您的答案在 docs

在服务需要创建某个依赖项的多个实例,或者需要显式控制此类依赖项的生命周期的情况下,可以使用抽象工厂。您应该注入(inject)一个创建 IMyService 新实例的 IMyServiceFactory,而不是注入(inject) IMyService:

// Definition
public interface IMyServiceFactory {
    IMyService CreateNew();
}

// Implementation
sealed class ServiceFactory : IMyServiceFactory {
    public IMyService CreateNew() {
        return new MyServiceImpl();
    }
}

// Registration
container.RegisterSingle<IMyServiceFactory, ServiceFactory>();

// Usage
public class MyService {
    private readonly IMyServiceFactory factory;

    public MyService(IMyServiceFactory factory) {
        this.factory = factory;
    }

    public void SomeOperation() {
        using (var service1 = this.factory.CreateNew()) {
            // use service 1
        }

        using (var service2 = this.factory.CreateNew()) {
            // use service 2
        }
    }
}

关于c# - Simple Injector 使用元数据注册多种类型的相同接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760716/

相关文章:

c# - 数据包嗅探器套接字异常

asp.net - .NET Core IoC RegisterAssemblyTypes等效项

c# - 如何使用aspnetcore signalR向特定用户发送消息?

c# - 为数据网格的标题添加不同的上下文菜单

.net - WPF Datagrid 循环/选择具有特定属性的单元格

android - 是否可以将 DI 与 androidx.navigation.NavController 一起使用

javascript - 使对象在要测试的函数中可用

c# - 在 MVC Web 应用程序中连接到多个数据库

c# - Cookie 过期在 C# 中不起作用

c# - SplitContainer 中的 FixedPanel 导致不知道大小