Шаблон дизайна активной записи? - PullRequest
4 голосов
/ 04 июля 2010

В последнее время я изучал различные среды ORM (в основном .net) и вижу, что шаблон проектирования Active Record обычно используется для сохранения данных.

Мне просто интересно, как все воспринимают шаблон активной записи? Лично я думаю, что это накладывает слишком большую ответственность на объект данных, будь то просто контейнер данных или объектный компонент. Я всегда обращался к постоянным объектам из центрального контроллера, который предоставляет метод, такой как Persist (), который принимает интерфейс, скажем, IEntityBean, а не позволяет компоненту сортировать его постоянство. Это также подход, который я использую для заполнения. Я получаю набор данных и в общем случае заполняю бин, а не позволяю бину брать набор данных и сам заполняется. Я просто не люблю бобы с логикой. Это старомодный подход или другие разделяют мои страхи?

Как платформы ORM, которые не используют таблицы сопоставления с образцом активной записи, для объекта и объекта для таблиц? Является ли центральный контроллер, который контролирует сохранение плохой подход?

Спасибо за ваше мнение заранее!

Ответы [ 3 ]

4 голосов
/ 04 июля 2010

Я не использую ActiveRecord, потому что ActiveRecord постоянно нарушает SRP . у нас есть собственный внутренний ORM.

EDIT

В нашем ORM мы активно используем возможности C # 3.0. У нас есть проект библиотеки под названием Application.Infrastructure, в котором размещены все базовые классы для наших бизнес-объектов. У нас есть структура проверки и автоматическое сопоставление с использованием атрибутов.

ORM интенсивно использует атрибуты для автоматизации большинства утомительных задач, таких как сопоставление и проверка. Я могу добавить новую функцию в качестве нового аспекта в рамках.

Атрибут TableMapping позволит нам узнать, к какой таблице относится этот объект. Атрибут DataFieldMapping позволит нам узнать, к какому столбцу относится свойство объекта theject. validation framework позволяет мне проверять каждое поле с помощью назначенного ValidationAttribute.

Каждый бизнес-объект имеет базовый класс EntityBase, а бизнес-коллекции имеют EntityCollectionBase. Мы используем традиционные наборы данных для взаимодействия с базой данных, и мы написали метод расширения для EntityBase, EntityCollectionBase, DataRow и DataTable. Эти методы exntesion будут считывать метаданные отображения из атрибутов объекта и выполнять [двустороннее] отображение через Reflection.

Пример бизнес-объекта будет выглядеть в моем приложении следующим образом.

User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}
1 голос
/ 04 июля 2010

Я использовал Castle ActiveRecord (на основе NHibernate) после того, как много экспериментировал с самим NHibernate.Подход ORM работает достаточно быстро, если вы не читаете или не пишете много объектов.

В NHibernate вам приходилось указывать отображения через XML-файлы (большая боль в том, чтобы синхронизировать их с кодом) иВ прошлый раз, когда я работал с ним, была возможность определить их, используя атрибуты в коде.Очевидно, это интенсивно используется на фоне отражения кода и генерации кода для выполнения всей "магии".Продвинувшись дальше с использованием ActiveRecord, я остался доволен обслуживаемостью подхода ORM.

Что мне не понравилось в Castle ActiveRecord, так это то, что вы должны были извлечь класс ActiveRecord из базовой ActiveRecordBase.Это иногда является довольно строгим требованием, потому что по сути вы можете захотеть извлечь его из чего-то другого и позволить ему вести себя только как ActiveRecord.Есть способ избежать этого, используя ActiveRecordMediator .

У меня еще нет опыта работы с решением MS, так как в то время, когда я нуждался в нем, у них ничего не было (они пришли слишком поздно срабочая основа). Castle Project предоставил почти все, что мне было нужно для большего веб-разработки, от инверсии контейнеров управления до высокоуровневого ORM.

0 голосов
/ 04 июля 2010

DataMapper намного мощнее.

Единственный ORM, который мне нравится (хотя я не знаю .Net) и который я считаю достаточно гибким, это SQLAlchemy, взгляните на некоторые примеры.

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