您如何看待如下所示混合存储库和Active Record模式?
如何实现GetAll()
方法有关包含继承的内容?
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Person(int id)
{
this.Id = id;
new PersonRepository().Load(this);
}
public virtual void Save()
{
new PersonRepository().Save(this);
}
}
class Employee : Person
{
public int RegistrationNumber { get; set; }
public Employee(int id) : base(id)
{
new EmployeeRepository().Load(this);
}
public override void Save()
{
base.Save();
new EmployeeRepository().Save(this);
}
}
interface IRepository<T>
{
void Save(T x);
bool Load(T x);
IEnumerable<T> GetAll();
// Other methods removed to keep code clean
}
class PersonRepository : IRepository<Person>
{
public void Save(Person x)
{
throw new NotImplementedException();
}
public bool Load(Person x)
{
throw new NotImplementedException();
}
public IEnumerable<Person> GetAll()
{
throw new NotImplementedException();
}
}
class EmployeeRepository : IRepository<Employee>
{
public void Save(Employee x)
{
throw new NotImplementedException();
}
public bool Load(Employee x)
{
throw new NotImplementedException();
}
public IEnumerable<Employee> GetAll()
{
// How to return Person data????
throw new NotImplementedException();
}
}
答案 0 :(得分:1)
如果您担心会产生加载所有Person
个对象的开销,那么在实际需要数据之前可能不会加载它们 - 例如通过延迟加载方法
如果您需要填写“人物”列表但不想带回所有数据 - 只需要列表所需的内容(比如ID,名字和姓),那么只做 - 也许使用人物对象不是正确的方法,因为它太重了?
我倾向于做的是记住一个概念(比如人),并有两个代表它们的类: - 为列表等设计的轻量级类,通常是只读的。 - 在“人物”上执行操作时的“全功能”对象。
从架构上来说,你所做的事情没有任何问题,但它完全是基于OO的 - 它不关心数据检索对软件实际运行环境可能带来的物理限制的影响。
基本上你的方法很棒但是基于“每类”方法而不是基于集合的方法。