gpt4 book ai didi

c# - .net 核心注册通用接口(interface)并使用 getservice 检索它们

转载 作者:行者123 更新时间:2023-12-05 04:43:38 24 4
gpt4 key购买 nike

我有接口(interface)IOrder<T>FurnitureOrder<T>实现它

我需要像这样注册多个实现

services.AddSingleton(IOrder<Chair>, FurnitureOrder<Chair>())
services.AddSingleton(IOrder<Table>, FurnitureOrder<Table>())

现在我需要检索所有 IOrder服务和类型(例如椅子、 table )来做一些背景工作。我可以使用 GetServices 得到它吗?应用程序接口(interface)?如果不可能,请建议是否需要更改设计

最佳答案

一种方法是引入一些通用的非泛型接口(interface)IOrder并按原样注册所有服务(类似框架为 hosted services 注册和执行所做的事情):

interface IOrder
{
}

interface IOrder<T> : IOrder
{
}

services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrder, FurnitureOrder<Chair>>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrder, FurnitureOrder<Table>>());

然后您可以将它们作为 IEnumerable<IOrder> 注入(inject)进入你的依赖类或使用 IServiceProvider.GetServices<IOrder>()打电话解决。

另请注意,下一次注册也应该有效:

services.AddSingleton<IOrder, FurnitureOrder<Chair>>()
services.AddSingleton<IOrder, FurnitureOrder<Table>>()

如果您需要通用注册,您也可以使用类似这样的方式自动进行非通用注册(在注册所有通用注册之后):

var serviceDescriptors = services
.Where(descriptor => descriptor.ServiceType.IsConstructedGenericType)
.Where(descriptor =>
descriptor.ServiceType.GetGenericTypeDefinition() == typeof(IOrder<>));
foreach (var sd in serviceDescriptors)
{
services.TryAddEnumerable(ServiceDescriptor.Transient(typeof(IOrder),
p => p.GetService(sd.ServiceType))); // or add desciptor creating new based on existing one
}

关于c# - .net 核心注册通用接口(interface)并使用 getservice 检索它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69572620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com