具有多个约束和继承的C#存储库

时间:2015-04-16 09:53:39

标签: c# generics repository-pattern multiple-inheritance generic-constraints

我无法找到类似的问题,但如果我错过了它,请随时重定向我。 我试图熟悉存储库模式。

我将举例说明我试图上班失败的代码。 这些是表示我正在使用的实体的类和接口。

public class AbsObj
{
    public string Code { get; set; }
}

public interface IAbsObj
{
    bool Save();
}

public class User : AbsObj
{
    public string Language{get; set;}
}

public class DbUser : User, IAbsObj
{
    public bool Save()
    {
        return true;
    }
}

然后到存储库接口

public interface IRepository<T>
{
    void Add(T value);
    void Update(T value);
    void Delete(T value);
}

通用存储库

public class Repository<T> : IRepository<T> where T : AbsObj, IAbsObj
{

    protected List<T> _lst;

    public Repository()
    {
        _lst = new List<T>();
    }
    public void Add(T value)
    {

    }
    public void Update(T value)
    {

    }
    public void Delete(T value)
    {

    }        
    public bool Save()
    {
        for (int i = 0; i < _lst.Count; i++)
        {
            _lst[i].Save();
        }
        return true;
    }
}

然后是一个更具体的存储库,它应该处理来自db:

的用户加载
public class UserRepository<T> : Repository<T> where T : AbsObj, IAbsObj
{
    public void Load()
    {
        DbUser us = new DbUser();
        us.Code = "Cod";
        us.Language = "IT";
        _lst.Add(us);
    }
}

我创建了DBUser类,以便将来可以自由地创建一个XMLUser来处理不同类型的保存。 它继承自User,而User又继承自AbsObj。 它实现了IAbsObj。 尽管如此,当我尝试将DbUser对象添加到列表中时,我遇到了编译时错误,指出它无法从DBUser转换为T. 鉴于我所采取的限制,这是可能的:我在这里缺少什么? 在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的UserRepository定义可能是:

public class UserRepository : Repository<DbUser>
{
  ....
}

但是既然你想让它也成为XMLUser的通用:

public class UserRepository<T> : Repository<T> where T: User, new()
{

   public void Load()
   {
      User us = new T() as User;
      us.Code = "Cod";
      us.Language = "IT";
      _lst.Add(us);
   }
 }

使用:

    new UserRepostitory<DbUser>();
    new UserRepostitory<XmlUser>();