提问者:小点点

调用两个不同服务的C#泛型方法


我有以下的方法,这是添加产品使用注入的服务!它是在静态调用内部调用的,因此它是静态的!


    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个答案

匿名用户

您的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同时实现两个接口,而不是只实现其中一个接口。您甚至还没有考虑到在尝试调用此函数时会出现的错误,因为您的类可能不会实现这两个函数。

这使我质疑为什么您认为需要这样约束您的tt的唯一用法是调用services.getService(),因此对它的唯一约束应该是function所需的约束,这肯定不是您的两个接口。