关于我的问题: Cast and merge two lists of same interfaces but different types
我有
的通用接口定义IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>
为什么:
有两个数据库共享几乎相同的数据库模式 我正在尝试做的是,使用2个数据库上下文组合数据集。
// a bit a kind of pseudo-code
List<**GenericInterface**> unionlist = new List<**GenericInterface**>();
using (var context1 = new FirstContext())
{
unionlist.AddRange(await context1.Courses.ToListAsync());
}
using (var context2 = new SecondContext())
{
unionlist.AddRange(await context2.Courses.ToListAsync());
}
return unionlist;
两个数据库中的所有表都是共享相同接口的类。来自Course
- 类的引用很多,所以我的界面现在是这样的:
public interface IKurs<out T, out TDozent, out TKursInformation, out TKurseStichwoerter, out TStichwort> : IKurs
where T : ILehrerZuKurs<TDozent>
where TDozent : IZusatzDozent
where TKursInformation : IKursInformation
where TKurseStichwoerter : IKurseStichwoerter<TStichwort>
where TStichwort : IStichwort
{
(现在,界面中缺少一些参考文献)
我现在的问题是:
具有如此巨大的通用接口是好还是坏?如果没有,那么实现这一目标的更好的模式是什么?
我的API控制器将需要所有这些引用进行过滤。所以我得到了很多Include(...).Include(...).Include(...).Where(...)
答案 0 :(得分:1)
注意:这是一个主要基于意见的答案(但评论时间太长)
如果我是你,我会采取不同的方式。
我会声明一个数据服务接口和一个数据类
interface IFooDataService
{
Task<ICollection<Foo>> GetAllAsync();
}
class Foo
{
// some properties
}
对于每个存储点(Database,WebApi,无论如何),我实现了该接口,并将数据从存储映射到Foo
类。
一个包装类,它将从多个数据服务中获取数据
class CombinedFooDataService : IFooDataService
{
private static readonly IFooDataService[] _services;
public CombinedFooDataService( params IFooDataService[] services )
{
_services = services;
}
public async Task<ICollection<Foo>> GetAllAsync()
{
var tasks = _services.Select( e => e.GetAllAsync() );
var results = await Task.WhenAll( tasks );
return results.SelectMany( e => e ).ToList();
}
}
答案 1 :(得分:0)
您不能使用大型接口,必须使用小型接口。 在代码中必须遵循接口隔离原则。