首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码-设计良好实践接口的不良实践

代码-设计良好实践接口的不良实践
EN

Stack Overflow用户
提问于 2017-06-20 10:54:32
回答 2查看 191关注 0票数 0

关于我的问题:Cast and merge two lists of same interfaces but different types

我有一个通用的接口-定义

代码语言:javascript
复制
IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>

为什么:

有两个数据库共享一个几乎相同的数据库模式,我想要做的是,使用两个数据库上下文,一个数据集的联合。

代码语言:javascript
复制
// 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,如下所示:

代码语言:javascript
复制
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(...)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-20 11:33:06

Note:这是一个主要基于意见的回答(但太长了,不能发表评论)

如果我是你,我会走另一条路。

我将声明一个数据服务接口和一个数据类。

代码语言:javascript
复制
interface IFooDataService
{
    Task<ICollection<Foo>> GetAllAsync();
}

class Foo
{
    // some properties
}

对于每个存储点(数据库、WebApi等),我实现该接口,并将数据从存储映射到Foo类。

和一个包装类,它将从多个数据服务获取数据。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-06-20 11:17:06

不能使用大接口,必须使用小接口。在代码中必须遵循接口隔离原则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44651102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档