簡體   English   中英

具有通用接口的多級通用存儲庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM