[英]Multilevel generic repository with generic interface
I have problems with implementing of repository logic. 我在实现存储库逻辑时遇到问题。 In a real project I use Ninject, so I use interfaces for some classes.
在一个真实的项目中我使用Ninject,所以我使用接口来处理某些类。 For now I made a very simple demo of the problem:
现在我做了一个非常简单的问题演示:
// ------- Base User -------------- //
public interface IBaseUser
{
int Id { get; set; }
}
public class BaseUser : IBaseUser
{
public int Id { get; set; }
}
// -------- Individual User --------//
public interface IIndividualUser : IBaseUser
{
string Gender { get; set; }
}
public class IndividualUser: BaseUser, IIndividualUser
{
public string Gender { get; set; }
}
// -------- Legal User --------//
public interface ILegalUser : IBaseUser
{
string VatNumber { get; set; }
}
public class LegalUser : BaseUser, ILegalUser
{
public string VatNumber { get; set; }
}
// -------- Base User Repo --------//
public interface IBaseUserRepo<T> where T: BaseUser
{
T GetById(int id);
}
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
{
public T GetById(int id)
{
// logic...
}
}
// -------- Individual User Repo --------//
public interface IIndividualUserRepo : IBaseUserRepo<IndividualUser>
{
IndividualUser GetByGender(string gender);
}
public class IndividualUserRepo : BaseUserRepo<IndividualUser>, IIndividualUserRepo
{
public IndividualUser GetByGender(string gender)
{
// logic...
}
}
// -------- Legal User Repo --------//
public interface ILegalUserRepo : IBaseUserRepo<LegalUser>
{
LegalUser GetByVatNumber(string vatNumber);
}
public class LegalUserRepo : BaseUserRepo<LegalUser>, ILegalUserRepo
{
public LegalUser GetByVatNumber(string vatNumber)
{
// logic...
}
}
In this 2 lines of code: 在这两行代码中:
public class IndividualUserRepo : BaseUserRepo<IndividualUser>, IIndividualUserRepo
public class LegalUserRepo : BaseUserRepo<LegalUser>, ILegalUserRepo
the compiler fires this errors: 编译器触发此错误:
The type 'genericInterfaceTest.IndividualUser' cannot be used as type parameter 'T' in the generic type or method 'genericInterfaceTest.BaseUserRepo'.
类型'genericInterfaceTest.IndividualUser'不能用作泛型类型或方法'genericInterfaceTest.BaseUserRepo'中的类型参数'T'。 There is no implicit reference conversion from 'genericInterfaceTest.IndividualUser' to 'genericInterfaceTest.IBaseUserRepo'.
没有从'genericInterfaceTest.IndividualUser'到'genericInterfaceTest.IBaseUserRepo'的隐式引用转换。 C:\\Work\\Tests\\genericInterfaceTest\\genericInterfaceTest\\Program.cs 77 18 genericInterfaceTest
C:\\ Work \\ Tests \\ genericInterfaceTest \\ genericInterfaceTest \\ Program.cs 77 18 genericInterfaceTest
and 和
The type 'genericInterfaceTest.LegalUser' cannot be used as type parameter 'T' in the generic type or method 'genericInterfaceTest.BaseUserRepo'.
类型'genericInterfaceTest.LegalUser'不能在泛型类型或方法'genericInterfaceTest.BaseUserRepo'中用作类型参数'T'。 There is no implicit reference conversion from 'genericInterfaceTest.LegalUser' to 'genericInterfaceTest.IBaseUserRepo'.
没有从'genericInterfaceTest.LegalUser'到'genericInterfaceTest.IBaseUserRepo'的隐式引用转换。 C:\\Work\\Tests\\genericInterfaceTest\\genericInterfaceTest\\Program.cs 91 18 genericInterfaceTest
C:\\ Work \\ Tests \\ genericInterfaceTest \\ genericInterfaceTest \\ Program.cs 91 18 genericInterfaceTest
That happens only then I'm implementing the interface IBaseUserRepo in this line of code: 只有这样我才会在这行代码中实现接口IBaseUserRepo:
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
Can somebody explain me please where I'm wrong. 有人可以解释我,我错了。
I guess you intented to implement IBaseUserRepo<T>
interface in BaseUserRepo<T>
class, but what you did instead you constrained T
should be of basetype BaseUser
and also T
should implement IBaseUserRepo<T>
我猜你
IBaseUserRepo<T>
在BaseUserRepo<T>
类中实现IBaseUserRepo<T>
接口,但你所做的却是你的约束T
应该是BaseUser
而且T
应该实现IBaseUserRepo<T>
Change this 改变这个
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
To this 对此
public class BaseUserRepo<T> : IBaseUserRepo<T> where T : BaseUser
Now you've implemented IBaseUserRepo<T>
interface in BaseUserRepo<T>
class and constrained T
generic parameter to BaseUser
. 现在,您已在
BaseUserRepo<T>
类中实现了IBaseUserRepo<T>
接口, BaseUserRepo<T>
T
通用参数约束到BaseUser
。
Ordering matters :) 订购事宜:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.