简单注入器将多种类型的相同接口与元数据注册

本文关键字:接口 元数据 注册 注入器 种类 类型 简单 | 更新日期: 2023-09-27 18:36:00

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

附言我已经考虑过RegisterAll,但在这种情况下,当我只需要一个时,我被迫创建所有IFoo后代(并将其传递给控制器)。这对我来说不是解决方案。

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

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

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

使用简单注射器可以实现我的目标吗?

简单注入器将多种类型的相同接口与元数据注册

很抱歉让它起死回生,但正如史蒂文在评论中所说,您的答案在文档中

在服务需要创建某个依赖项的多个实例,或者需要显式控制此类依赖项的生存期的情况下,可以使用抽象工厂。与其注入 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
        }
    }
}