如何解析不同类型服务的 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:
您可能需要为两者注册 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();
}
}
}
这是我的界面:
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:
您可能需要为两者注册 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();
}
}
}