Смешивание шаблонов репозитория и Active Record относительно наследования - PullRequest
0 голосов
/ 01 марта 2011

Что вы думаете о смешивании шаблонов 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 Ответ

1 голос
/ 01 марта 2011

Если вы беспокоитесь о том, что придется загружать все объекты Person, то, возможно, не загружайте их до тех пор, пока вам действительно не понадобятся данные - например, с помощью подхода Lazy Load .

Если вам нужно было заполнить список «Люди», но вы не хотели возвращать ВСЕ их данные - только материал, необходимый для списка (скажем, ID, Имя и Фамилия), тогда делайте только это - возможно, используя Объект Person не правильный путь, потому что он слишком тяжелый?

То, что я склонен делать, это иметь в виду концепцию (как личность) и иметь два класса, которые представляют их: - Легкий класс, разработанный для списков и т. Д., Как правило, только для чтения. - «Полнофункциональный» объект для выполнения операций над «Лицом».

С архитектурной точки зрения нет ничего плохого в том, что вы делаете, но оно строго основано на ОО - его не касается последствий извлечения данных с точки зрения физических ограничений, которые могут быть наложены на вас средой, в которой фактически будет работать программное обеспечение.

В основном подход, который вы используете, великолепен, но основан на подходе «на класс», а не на основе множеств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...