代码设计良好做法的接口

关于我的问题是不好的做法: 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

回到顶部