我有以下的方法,这是添加产品使用注入的服务!它是在静态调用内部调用的,因此它是静态的!
public static async Task AddNewProducts(Guid shopId)
{
var productAService = IoC.Services.GetService<IProductAService>();
var added = await productAService.AddProduct(shopId);
}
它工作良好,但我需要使它通用,以便我可以使用不同的服务与它。像这样的东西!
public static async Task AddNewProducts<T>(Guid shopId) where T : IProductAService, IProductBService
{
var productService = IoC.Services.GetService<T>();
var added = await productService.AddProduct(shopId);
}
然而,第二个方法抱怨AddProduct方法不明确,不确定如何确保它从相关服务调用了正确的方法!
您的2个服务需要一个公共接口
public interface IProductService
{
void AddProduct(Guid shopId);
}
public interface IProductAService : IProductService
{
//specifics to service A
}
public interface IProductBService : IProductService
{
//specifics to service B
}
则您的静态泛型方法仅约束到共享接口
public static async Task AddNewProducts<TProductService>(Guid shopId)
where TProductService : IProductService
{
var productService = IoC.Services.GetService<TProductService>();
var added = await productService.AddProduct(shopId);
}
public static async Task AddNewProducts<T>(Guid shopId) where T : IProductAService, IProductBService
这一行的问题是,您需要t
同时实现两个接口,而不是只实现其中一个接口。您甚至还没有考虑到在尝试调用此函数时会出现的错误,因为您的类可能不会实现这两个函数。
这使我质疑为什么您认为需要这样约束您的t
。t
的唯一用法是调用services.getService
,因此对它的唯一约束应该是function所需的约束,这肯定不是您的两个接口。