我有以下问题。我有一个接口(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/