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

问题描述

这是我的界面:

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;
        }

解决方法

问题是您注入了通用接口 IEnumerable<ISocialService<ISocialModel>>,但您没有任何实现 ISocialService<ISocialModel> 的类,而是在类中实现了 ISocialService<T>
所以我们需要更新代码,例如

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 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();
        }
    }
}
,

看看这个链接:

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

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

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