我无法找到类似的问题,但如果我错过了它,请随时重定向我。 我试图熟悉存储库模式。
我将举例说明我试图上班失败的代码。 这些是表示我正在使用的实体的类和接口。
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. 鉴于我所采取的限制,这是可能的:我在这里缺少什么? 在此先感谢您的帮助!
答案 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>();