Использует ли LINQ to SQL шаблон ActiveRecord?

Я только что исследовал шаблон ActiveRecord и на его основе (http://en.wikipedia.org/wiki/Active_record_pattern), кажется, Linq 2 Sql более или менее реализует это, я ошибаюсь? или что нужно изменить, чтобы он соответствовал шаблону ActiveRecord?


person GONeale    schedule 12.06.2009    source источник
comment
Хороший вопрос, надеюсь, мы проясним это и проголосуем против 26971 ответа.   -  person John Farrell    schedule 12.06.2009


Ответы (3)


В некотором смысле это может показаться активным шаблоном записи, но на самом деле это не так. Базовый пример:

//load the entity
var c = myDataContext.Customers.FirstOrDefault(c => c.Id == 1876);
c.Name = "George Armstrong Custer";
 // saves the entity 
myDataContext.SubmitChanges();

Активная запись

//load the entity
var c = Customer.GetCustomer(9);
c.Name = "Varus";
//save the entity
c.Save();

Активная запись на самом деле включает только один класс, который покрывает модель и предоставляет интерфейс данных. Linq к Sql следует по другому пути, где есть несколько классов модели и отдельный интерфейс данных, иначе известный как репозиторий.

PS: Хороший пример ORM, использующего активный шаблон записи, можно найти в Subsonic.

person Wyatt Barnett    schedule 12.06.2009

Сам LINQ to SQL не является реализацией шаблона ActiveRecord. В настоящей реализации паттерна ActiveRecord Фаулера сам объект будет отвечать за сохранение и загрузку своего состояния из базы данных. При использовании объектов LINQ to SQL DataContext отвечает за восстановление базы данных, отслеживание состояния объекта и сохранение этих изменений обратно в базу данных.

Вам будет сложно обернуть эти классы LINQ to SQL в дополнительный код, чтобы сделать его истинной реализацией шаблона ActiveRecord (нет простого способа снять ответственность с DataContext).

person Justin Niessner    schedule 12.06.2009
comment
Я не уверен, что это совсем правильно. Объект сущности и DataContext разделяют ответственность - DataContext обеспечивает стандартную функциональность для преобразования общих данных атрибутов в SQL, но объект сущности обеспечивает сопоставления между членами объекта и базой данных. Кроме того, состояние сущности сохраняется в объекте - опять же, DataContext имеет только общие стандартные функциональные возможности для согласования состояния. - person Rex M; 12.06.2009
comment
Ты прав. Но дело в том, что ответственность по-прежнему разделяется, а не объект, обрабатывающий все самостоятельно (как в настоящей реализации шаблона ActiveRecord). - person Justin Niessner; 12.06.2009
comment
Предоставляет ли linq to sql отображение «один класс на таблицу»? Это характерно для ActiveRecord. Это уводит от других объектно-ориентированных шаблонов, таких как доменно-ориентированный дизайн. - person Brendan Kowitz; 12.06.2009

LINQ to SQL не является реализацией Active Record, что означает, что объекты полностью ответственны за управление своей персистентностью (например, за сохранение сохраняемости). Фактически LINQ to SQL является реализацией Unit of Work. Единица работы означает, что какой-то реестр или контекст отслеживает состояние сущностей, явно или неявно, позволяя сущностям полностью игнорировать свой механизм сохранения (т. Е. Игнорировать постоянство).

Unit of Work поддерживает стиль программирования под названием POCO (простой старый объект clr), который помогает вам поддерживать разделение проблем и соблюдать принцип единоличной ответственности. Когда эти два принципа соблюдены, ваше программное обеспечение обычно легче поддерживать. Active Record фактически нарушает оба этих принципа, что приводит к созданию более тесно связанного программного обеспечения, которое может быть труднее поддерживать.

person jrista    schedule 12.06.2009