[英]Multilevel generic repository with generic interface
我在實現存儲庫邏輯時遇到問題。 在一個真實的項目中我使用Ninject,所以我使用接口來處理某些類。 現在我做了一個非常簡單的問題演示:
// ------- 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...
}
}
在這兩行代碼中:
public class IndividualUserRepo : BaseUserRepo<IndividualUser>, IIndividualUserRepo
public class LegalUserRepo : BaseUserRepo<LegalUser>, ILegalUserRepo
編譯器觸發此錯誤:
類型'genericInterfaceTest.IndividualUser'不能用作泛型類型或方法'genericInterfaceTest.BaseUserRepo'中的類型參數'T'。 沒有從'genericInterfaceTest.IndividualUser'到'genericInterfaceTest.IBaseUserRepo'的隱式引用轉換。 C:\\ Work \\ Tests \\ genericInterfaceTest \\ genericInterfaceTest \\ Program.cs 77 18 genericInterfaceTest
和
類型'genericInterfaceTest.LegalUser'不能在泛型類型或方法'genericInterfaceTest.BaseUserRepo'中用作類型參數'T'。 沒有從'genericInterfaceTest.LegalUser'到'genericInterfaceTest.IBaseUserRepo'的隱式引用轉換。 C:\\ Work \\ Tests \\ genericInterfaceTest \\ genericInterfaceTest \\ Program.cs 91 18 genericInterfaceTest
只有這樣我才會在這行代碼中實現接口IBaseUserRepo:
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
有人可以解釋我,我錯了。
我猜你IBaseUserRepo<T>
在BaseUserRepo<T>
類中實現IBaseUserRepo<T>
接口,但你所做的卻是你的約束T
應該是BaseUser
而且T
應該實現IBaseUserRepo<T>
改變這個
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
對此
public class BaseUserRepo<T> : IBaseUserRepo<T> where T : BaseUser
現在,您已在BaseUserRepo<T>
類中實現了IBaseUserRepo<T>
接口, BaseUserRepo<T>
T
通用參數約束到BaseUser
。
訂購事宜:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.