简单注入器将多种类型的相同接口与元数据注册
本文关键字:接口 元数据 注册 注入器 种类 类型 简单 | 更新日期: 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
}
}
}