问题描述
这是我的界面:
public interface ISocialService<T> where T : ISocialModel
{
public Task<List<T>> GetPosts();
}
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();
}
}
}
,
看看这个链接:
您可能需要为两者注册 ISocialModel 才能将其识别为 IEnumerable 的集合: 例如
services.AddScoped<ISocialModel,RedditService>();
services.AddScoped<ISocialModel,HackerNewsService>();