C# 代码设计良好实践接口的不良实践

C# 代码设计良好实践接口的不良实践,c#,entity-framework,generics,interface,C#,Entity Framework,Generics,Interface,关于我的问题: 我有一个通用的接口定义 IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData> (尽管如此,界面中仍缺少一些引用) 我现在的问题是: 拥有如此庞大的通用接口是好还是坏的做法?如果不是,有什么更好的模式可以实现这一点? 我的API控制器需要所有这些引用来进行过滤。所以我得到了很多Include(…).Include(…).Include(…).Where(…)你不能使

关于我的问题:

我有一个通用的接口定义

IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>
(尽管如此,界面中仍缺少一些引用)

我现在的问题是:

拥有如此庞大的通用接口是好还是坏的做法?如果不是,有什么更好的模式可以实现这一点?
我的API控制器需要所有这些引用来进行过滤。所以我得到了很多
Include(…).Include(…).Include(…).Where(…)
你不能使用大接口,你必须使用小接口。
代码中必须遵循接口隔离原则。

:这是一个主要基于意见的答案(但太长了,无法发表评论)

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

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

interface IFooDataService
{
    Task<ICollection<Foo>> GetAllAsync();
}

class Foo
{
    // some properties
}

为什么不让这两个上下文使用相同的实体类呢?然后你就可以去掉接口,让它简单多了。@Maarten抱歉,更新了问题,它们共享几乎相同的表和属性。两者都有一些单独的表和一些自己的参考。我想我需要重新设计我的结构。。。太好了,这看起来更清楚:)
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
{
interface IFooDataService
{
    Task<ICollection<Foo>> GetAllAsync();
}

class Foo
{
    // some properties
}
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();
    }
}