具有自定义列名的C#MVC通用存储库

时间:2011-07-19 10:22:57

标签: c# model-view-controller generics repository design-patterns

如何实现以下目标?

public interface IGenericRepository 
{
    int id { get; }

    T GetById<T>() where T : class
}

public class GenericRepository : IGenericRepository 
{
    //Some code here

    public T GetById<T>(int tid) where T : class 
    { 
        return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl;
    }
 }

我想用这个如下:

GenericRepository gr = new GenericRepository();
Category cat = gr.GetById<Category>(15);

当然,在这种用法中,GenericRepository中的tbl.id给出了一个错误。

public class IHasId
{
    public int id { get; set; }
}

public interface IGenericRepository
{
    int id { get; }

    T GetById<T>(int id) where T : IHasId;
}

public class GenericRepository : IGenericRepository
{
    public int id
    {
        get { throw new NotImplementedException(); }
    } 

    public T GetById<T>(int id) where T : IHasId
    {
        return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl;
    }
}

除此之外,不要忘记在模型中的某处定义:

public partial class Category : IHasId { }

用法是:

Repository rep = new Repository();
Category cat = rep.GetById<Category>(15);

3 个答案:

答案 0 :(得分:2)

这里有一些问题 - 第一个是你匹配的泛型类型是一个类,但是一个类没有一个名为'id'的属性。您需要让Category类实现一个公开'id'属性的接口:

public interface IIdentity
{
    int identity { get; set; }
}

public class Category : IIdentity
{
    public int identity{ get; set; }
}

我不知道为什么你将'id'作为IGenericRepository接口上的属性公开 - 当然这应该是传递给find方法的参数(如你的实现所示)。您还需要更改“GetById”方法的限制:

where T : class

类似

where T : IIdentity

使用我上面建议的界面。

答案 1 :(得分:1)

您收到此错误是因为您接受了每个班级where T : class。一个班级没有那个属性。

创建一个抽象类或接口以确保此属性存在并将where T : class更改为where T : IHasIdProperty

答案 2 :(得分:1)

public class IHasId
{
    public int id { get; set; }
}

public interface IGenericRepository<T>
{
    int id { get; }

    T GetById(int id);
}

public class GenericRepository<T> : IGenericRepository<T> where T : IHasId
{
    public int id
    {
        get { throw new NotImplementedException(); }
    }

    public T GetById(int id)
    {
        return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl;
    }
}