public interface ICustomService { void MethodA(); void MethodB(); } public class CustomService: ICustomService { public void MethodA() { } public void MethodB() { } } //堆代码 duidaima.com //注入 builder.Services.AddTransient<ICustomService, CustomService>(); //使用 private readonly ICustomService _customService; public CustomController(ICustomService customService) { _customService = customService; }现在我们需要增加一种实现。
//堆代码 duidaima.com //基接口 public interface ICustomBaseService { void MethodA(); void MethodB(); } //多个空接口 public interface ICustomService : ICustomBaseService { } public interface ICustomServiceV2 : ICustomBaseService { } //第一种实现 public class CustomService: ICustomService { public void MethodA() { } public void MethodB() { } } //第二种实现 public class CustomServiceV2: ICustomServiceV2 { public void MethodA() { } public void MethodB() { } } //注入 builder.Services.AddTransient<ICustomService, CustomService>(); builder.Services.AddTransient<ICustomServiceV2, CustomServiceV2>(); //使用 private readonly ICustomService _customService; private readonly ICustomServiceV2 _customServiceV2; public CustomController(ICustomService customService,ICustomServiceV2 customServiceV2) { _customService = customService; _customServiceV2 = customServiceV2; }这种实现方式需要增加了一套空接口做隔离,看似可能比较“浪费”,但后期随着项目的演进,ICustomService和ICustomServiceV2可能会慢慢分化,我们可以很方便的为它们扩充各种独有方法。
public interface ICustomService { void MethodA(); void MethodB(); } //第一种实现 public class CustomService: ICustomService { public void MethodA() { } public void MethodB() { } } //第二种实现 public class CustomServiceV2: ICustomService { public void MethodA() { } public void MethodB() { } } //注入 builder.Services.AddTransient<ICustomService, CustomService>(); builder.Services.AddTransient<ICustomService, CustomServiceV2>(); //使用 private readonly ICustomService _customService; private readonly ICustomServiceV2 _customServiceV2; public CustomController(IEnumerable<ICustomService> customServices) { _customService = customServices.ElementAt(0); _customServiceV2 = customServices.ElementAt(1); }从上面代码可以看到,我们是为从接口ICustomService注册两个实现,并从IEnumerable<ICustomService>解析出了这两个实现。这里可能会有两个疑问
2.为什么可以从IEnumerable<ICustomService>解析到我们需要的服务?