По различным причинам мы пишем новую библиотеку бизнес-объектов/хранилищ данных. Одним из требований этого уровня является разделение логики бизнес-правил и фактического уровня хранения данных.Архитектура для доступа к объектам бизнес-объектов/доступа к базам данных
Возможно иметь несколько слоев хранения данных, которые реализуют доступ к одному и тому же объекту - например, основной источник данных для хранения данных, который реализует большинство объектов, и другой источник «ldap», который реализует объект User. В этом случае Пользователь может, необязательно, поступать из источника LDAP, возможно, с немного отличающимися функциональными возможностями (например, невозможно сохранить/обновить объект User), но в остальном он используется приложением одинаково. Другим типом хранения данных может быть веб-служба или внешняя база данных.
Существует два основных способа реализации этого, и мы с коллегой не согласны с фундаментальным уровнем, который является правильным. Я хотел бы получить совет, по которому лучше всего использовать. Я постараюсь, чтобы мои описания были максимально нейтральными, так как я ищу некоторые объективные точки зрения здесь.
Бизнес-объекты являются базовыми классами, а объекты хранения данных наследуют бизнес-объекты. Клиентский код имеет дело с объектами хранения данных.
В этом случае общие бизнес-правила наследуются каждым объектом хранения данных, и это объекты хранения данных, которые непосредственно используются клиентским кодом.
Это подразумевает, что клиентский код определяет, какой метод хранения данных должен использоваться для данного объекта, поскольку он должен явно объявлять экземпляр для этого типа объекта. Код клиента должен явно знать информацию о соединении для каждого используемого типа хранилища данных.
Если уровень хранения данных реализует различные функции для данного объекта, клиентский код явно знает об этом во время компиляции, потому что объект выглядит иначе. Если метод хранения данных изменен, клиентский код должен быть обновлен.
Бизнес-объекты инкапсулируют объекты хранения данных.
В этом случае бизнес-объекты непосредственно используются клиентским приложением. Клиентское приложение передает информацию о базовом соединении в бизнес-уровень. Решение о том, какой метод хранения данных используется данным объектом, производится с помощью кода бизнес-объекта. Информация о соединении будет представлять собой фрагмент данных, взятых из файла конфигурации (клиентское приложение действительно не знает/не заботится о деталях), которое может быть одной строкой соединения для базы данных или несколькими строками соединения для различных типов хранения данных. Дополнительные типы хранилищ данных также могут быть прочитаны из другого места - например, таблица конфигурации в базе данных, которая указывает URL-адреса на различные веб-службы.
Выгода здесь заключается в том, что если новый существующий объект хранения добавлен к существующему объекту, параметр конфигурации можно установить во время выполнения, чтобы определить, какой метод использовать, и он полностью прозрачен для клиентских приложений. Не следует изменять клиентские приложения, если метод хранения данных для данного объекта изменяется.
Бизнес-объекты являются базовыми классами, объекты источника данных наследуют от бизнес-объектов. Клиентский код в основном касается базовых классов.
Это похоже на первый метод, но клиентский код объявляет переменные базовых типов бизнес-объектов, а статические методы Load()/Create()/etc на бизнес-объектах возвращают соответствующие объекты с типизированным источником данных.
Архитектура этого решения аналогична первому методу, но главным отличием является решение о том, какой объект хранения данных использовать для данного бизнес-объекта создается бизнес-уровнем, а не кодом клиента.
Я знаю, что уже существующие библиотеки ОРМ, которые обеспечивают некоторые из этих функций, но, пожалуйста, скидка те, на данный момент (есть вероятность того, что слой хранения данных осуществляется с одной из этих библиотек ORM) - также отметить, Я намеренно не говорю вам, какой язык здесь используется, кроме того, что он строго типизирован.
Я ищу общий совет, по которому лучше использовать метод (или не стесняйтесь предлагать что-то еще), и почему.