混合有关继承的存储库和活动记录模式

时间:2011-03-01 01:28:38

标签: c# architecture activerecord repository

您如何看待如下所示混合存储库和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();
    }
}

1 个答案:

答案 0 :(得分:1)

如果您担心会产生加载所有Person个对象的开销,那么在实际需要数据之前可能不会加载它们 - 例如通过延迟加载方法

如果您需要填写“人物”列表但不想带回所有数据 - 只需要列表所需的内容(比如ID,名字和姓),那么只做 - 也许使用人物对象不是正确的方法,因为它太重了?

我倾向于做的是记住一个概念(比如人),并有两个代表它们的类:   - 为列表等设计的轻量级类,通常是只读的。   - 在“人物”上执行操作时的“全功能”对象。

从架构上来说,你所做的事情没有任何问题,但它完全是基于OO的 - 它不关心数据检索对软件实际运行环境可能带来的物理限制的影响。

基本上你的方法很棒但是基于“每类”方法而不是基于集合的方法。