如何解析不同类型服务的 IEnumerable

How do I resolve IEnumerable of services of different types

这是我的界面:

public interface ISocialService<T> where T : ISocialModel
{
    public Task<List<T>> GetPosts();
}

我有这个接口的 2 个实现。 这就是我尝试注册它们的方式

services.AddScoped<ISocialService<RedditPost>, RedditService>();
services.AddScoped<ISocialService<HackerNewsModel>, HackerNewsService>();

最后这就是我尝试解决它们的方法。

public ScrapeJob(IEnumerable<ISocialService<ISocialModel>> socialServices)
{
    _socialServices = socialServices;
}

但是 socialServices 是空的。 我认为问题出在 ISocialModel 上。 有人对我如何正确注册或解决它们有任何建议吗?

我想使用通用接口的原因是我想像这样将特定服务注入控制器:

public HackerNewsController(ISocialService<HackerNewsModel> socialService)
        {
            _socialService = socialService;
        }

看看这个link:

https://www.stevejgordon.co.uk/asp-net-core-dependency-injection-registering-multiple-implementations-interface

您可能需要为两者注册 ISocialModel,以便将其识别为 IEnumerable 的集合: 例如

services.AddScoped<ISocialModel, RedditService>();
services.AddScoped<ISocialModel, HackerNewsService>();

问题是你已经注入了通用接口 IEnumerable<ISocialService<ISocialModel>> 但你没有任何 class 实现 ISocialService<ISocialModel> 而你在 [= 中有 ISocialService<T> 实现23=]es.
所以我们需要按照例如

的方式更新代码
public interface ISocialModel
{

}

public class RedditModel : ISocialModel
{

}

public interface ISocialService
{
     Task<List<ISocialModel>> GetPosts();
}

public interface ISocialService<T>: ISocialService where T : ISocialModel
{
     Task<List<T>> GetPosts();
}

public abstract class SocialServiceBase<T> : ISocialService<T> where T : ISocialModel

{
    async Task<List<ISocialModel>> ISocialService.GetPosts()
    {
        var posts = await GetPosts();

        return posts.Cast<ISocialModel>().ToList();
    }

   public abstract Task<List<T>> GetPosts();
    
}

public class RedditSocialService : SocialServiceBase<RedditModel>
{
    public override Task<List<RedditModel>> GetPosts()
    {
        //TODO: past your implementation here


    }
}

所以在注册中你可以写下面的代码

    services.AddScoped<ISocialService, RedditService>(); 
    services.AddScoped<ISocialService, HackerNewsService>();

以后 class 你可以这样使用

  class ScrapeJob
{
    private IEnumerable<ISocialService> _socialServices;

    public ScrapeJob(IEnumerable<ISocialService> socialServices)
    {
        _socialServices = socialServices;
    }


    public async Task DoScrapeJob()
    {
        foreach( var service in _socialServices)
        {
           var posts = await service.GetPosts();
        }
    }
}