Re: Отношения ORM в приложении ...
Надеюсь, это тот ответ, который вы ищете ...
В большинстве фреймворков веб-приложений в мире сценариев (например, perl, ruby, python, php) большую часть времени я видел бизнес-логику, реализованную на уровне объектов ORM. Например. в приложении Rails он находится на уровне ActiveRecord
; если вы используете DBix::Class
, это будет на уровне Result
-класса.
Более конкретно, в случае DBIx::Class
, если у вас есть таблица с именем VENDOR
, будет класс с именем MySchema::Result::Vendor
, который представляет одну строку в таблице VENDOR
. Просто добавьте свои бизнес-методы в этот класс.
Одним из недостатков этого подхода является то, что он связывает вашу бизнес-логику с классом ORM, что может усложнить (модульное) тестирование. Одним из решений этой проблемы является использование облегченной базы данных для модульных тестов (например, SQLite), а ORM, такой как DBIx::Class
, облегчит переключение между ними. Конечно, это не будет работать, если вы полагаетесь на функции SQL, которые не реализованы в SQLite.
Другой подход - поместить ваши методы бизнес-логики в роль Moose. Затем эти методы можно объединить либо в класс DBIx :: Class Result, либо в фиктивный объект для тестирования. Я могу привести пример, если хотите.
Одно большое предположение из вышесказанного состоит в том, что ваш бизнес-объект = одна строка в базе данных. Если это не так (т. Е. Ваш бизнес-объект охватывает несколько таблиц), вы, вероятно, захотите создать «оболочку» или контейнерный объект, имеющий в качестве экземпляров элементы каждый из составляющих объектов ORM. К счастью, в Moose есть отличное средство для делегирования методов (поиск Moose delegation
и атрибут handles
объявлений членов экземпляра), поэтому относительно легко сделать составной бизнес-объект из двух или более объектов ORM. Опять же, я могу привести вам пример этого, если хотите.
НТН