我有以下问题。我有一个界面说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实现我的目标?
答案 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
}
}
}