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

时间:2017-06-20 10:54:33

标签: c# entity-framework generics interface

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

我有

的通用接口定义
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 - 类的引用很多,所以我的界面现在是这样的:

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(...)

2 个答案:

答案 0 :(得分:1)

注意:这是一个主要基于意见的答案(但评论时间太长)

如果我是你,我会采取不同的方式。

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

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

class Foo
{
    // some properties
}

对于每个存储点(Database,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();
    }
}

答案 1 :(得分:0)

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