【发布时间】:2020-08-04 22:50:18
【问题描述】:
我正在为 C# 和 Entity Framework 编写一个通用存储库,并且我试图在不添加一大堆额外接口的情况下让该代码正常工作。
基本上,我有一个名为 HavePrimaryKey<TKey> 的类,所有数据库实体都继承自该类:
public class MemberInfo : HavePrimaryKey<int>
如您所见,它们可以定义类使用的主键类型。
这让我可以这样做:
public interface IDbGenericIdRepository<T, TKey> : IDbGenericRepository<T>
where T : HavePrimaryKey<TKey>
但是,这意味着我需要在创建存储库时定义 EACH 和 EVERY 键:
IDbGenericIdRepository<MemberInfo, int>
实际上,如果能够让编译器根据第一种类型必须从第二种类型继承的事实来暗示第二种类型会更好:
IDbGenericIdRepository<MemberInfo>
例如在上述情况下,由于 MemberInfo 继承自 HavePrimaryKey<int>,那么它希望会隐含地发现它需要一个 int ......但它只是抱怨说“需要 2 个类型的参数”
解决此问题的一种方法是为每种类型使用不同的存储库:
public interface IDbGenericIntIdRepository<T> : IDbGenericRepository<T>
where T : HavePrimaryKey<int>
public interface IDbGenericStrIdRepository<T> : IDbGenericRepository<T>
where T : HavePrimaryKey<string>
等等...但我希望可能有一种不那么蛮力的方法来管理这个?
有什么想法吗?
非常感谢,
菲尔。
【问题讨论】:
-
不幸的是,编译器无法读懂你的想法。但是,这里的主要问题是您在 EF 上使用通用存储库。有点像逃离马戏团加入孤儿院
-
在你的
HavePrimaryKey类中,你需要它是T还是你可以使用Type?即在你的代码中你没有做typeof(T)? -
你打算如何使用 HavePrimaryKey
接口? -
你能分享你的
HavePrimaryKey课程吗?另外,只是为了确认您使用的是EntityFramework还是Entity Framework Core。 -
是的,我只会做一个接口,而不是像这样的基类。尽管正如上面的人指出的那样,基于 EF 的通用 repo 有点反模式
标签: c# .net entity-framework .net-core repository-pattern