代码设计良好做法的接口
关于我的问题是不好的做法: Cast and merge two lists of same interfaces but different types设计" title="代码设计">代码设计良好做法的接口
我有
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
引用-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(...)
回答:
注意:这是一个基于主要意见答案(但太长的评论)
如果我是你,我会去一个不同的方式。
我声明一个数据服务接口和一个数据类
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();
}
}
回答:
你不能使用大接口,你必须使用小接口。 代码中必须遵循接口隔离原则。
以上是 代码设计良好做法的接口 的全部内容, 来源链接: utcz.com/qa/263268.html