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

时间:2015-01-03 23:33:00

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

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

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

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

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

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

是否有可能通过Simple Injector实现我的目标?

1 个答案:

答案 0 :(得分:1)

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

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