关于我的问题:Cast and merge two lists of same interfaces but different types
我有一个通用的接口-定义
IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>为什么:
有两个数据库共享一个几乎相同的数据库模式,我想要做的是,使用两个数据库上下文,一个数据集的联合。
// 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-class的引用很多,所以我的界面现在是s.th,如下所示:
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(...)
发布于 2017-06-20 11:33:06
Note:这是一个主要基于意见的回答(但太长了,不能发表评论)
如果我是你,我会走另一条路。
我将声明一个数据服务接口和一个数据类。
interface IFooDataService
{
Task<ICollection<Foo>> GetAllAsync();
}
class Foo
{
// some properties
}对于每个存储点(数据库、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();
}
}发布于 2017-06-20 11:17:06
不能使用大接口,必须使用小接口。在代码中必须遵循接口隔离原则。
https://stackoverflow.com/questions/44651102
复制相似问题