简体   繁体   English

具有通用接口的多级通用存储库

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM