如何在ServiceCollection中按请求类型解析泛型服务(类似ILogger)
在ASP.NET Core依赖注入中实现基于消费类的泛型服务注入
我定义了以下接口与类:
public interface IService { } public interface IService<TCategory> : IService { } public class Service<TCategory> : IService<TCategory> { }
我希望通过IServiceCollection实现:当按如下方式解析时,为MyClass注入Service<MyClass>,为OtherClass注入Service<OtherClass>:
public class MyClass { public MyClass(IService service) => Service = service; IService Service { get; } // 应注入Service<MyClass> } public class OtherClass { public OtherClass(IService service) => Service = service; IService Service { get; } // 应注入Service<OtherClass> }
我不希望采用如下注册方式,因为它要求在构造函数中重复指定具体泛型类型:
serviceCollection.AddSingleton(typeof(IService<>), typeof(Service<>)); public class MyClass { public MyClass(IService<MyClass> service) => Service = service; IService Service { get; } } public class OtherClass { public OtherClass(IService<OtherClass> service) => Service = service; IService Service { get; } }
我不想在构造函数中重复声明当前所在类的泛型类型,希望实现与ILogger/Logger<TCategory>相同的效果。我原本期望找到接受Func<IServiceProvider, Type, object>委托的扩展方法,但未能找到。
补充说明:此类需求在其他容器(如SimpleInjector)中可实现,示例代码如下:
container.RegisterConditional(typeof(ILogger), _ => typeof(Logger<>).MakeGenericType(_.Consumer!.ImplementationType), Lifestyle.Singleton, _ => true);
我希望找到在Microsoft的IServiceCollection中实现该需求的等价方法。
内容的提问来源于stack exchange,提问作者Ristogod
相关产品推荐
相关产品推荐

