1

我找不到类似的问题,但如果我错过了,请随时重定向我。我正在尝试熟悉存储库模式。

我会给你一个我试图不成功地工作的代码的例子。这些是代表我正在使用的实体的类和接口。

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;
    }
}

然后是一个更具体的存储库,它应该处理从数据库加载用户:

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。鉴于我认为这是可能的约束:我在这里缺少什么?提前感谢您的帮助!

4

1 回答 1

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>();
于 2015-04-16T13:25:29.030 回答