Simple Injector 使用元数据注册多种类型的相同接口

Simple Injector register multiple type of same interface with metadata

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

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

另一种解决方案是为不同的 IFoo 实现创建不同的控制器并使用基于上下文的注入,但这将导致我想要避免的重复 code/controllers。

理想情况下,解决方案应该类似于

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

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

很抱歉让它复活,但正如史蒂文在评论中所说,你的答案在 docs

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