Шаблон карт данных
До сих пор я использовал Active records во всех приложениях, управляемых базой данных С#. Но теперь мое приложение требует, чтобы мой код сохранения был разделен на мои бизнес-объекты. Я прочитал много сообщений о шаблоне сопоставления данных Мартина Фаулера, но мои знания об этом шаблоне все еще очень ограничены.
Используйте следующий пример:
Если у меня есть 2 таблицы - Customer и CustomerParameters. Таблица CustomerParameters содержит значения по умолчанию для клиента для создания нового Клиента.
Затем мне нужно будет создать класс CustomersMapper для обработки всех постоянных клиентов. Класс My Customer и CustomersList затем будет сотрудничать с этим классом mapper, чтобы сохранить данные клиента.
У меня есть следующие вопросы:
-
Как перенести необработанные данные TO и FROM из моего класса Customer в mapper без нарушения определенных бизнес-правил? DTO-х?
-
Допустимо ли иметь метод SaveAll и LoadAll в моем классе Mapper для обновления и загрузки нескольких данных клиентов? Если это так, в случае SaveAll, как разработчик будет знать, когда обновлять или вставлять данные?
-
Будет ли отвечать за класс сопоставления клиента за получение значений по умолчанию из таблицы CustomerParameters, или будет лучше создать сопоставление CustomerParameters?
Инструмент отображения O/R на самом деле не существует. Я использую базу данных Transactional и требую, чтобы я написал свой собственный шаблон Mapper.
Будут оценены любые идеи и комментарии.
Ответы
Ответ 1
Шон я бы ответил на ваши вопросы следующим образом:
ad 1) Mapper отвечает за создание объекта Customer. У вашего объекта Mapper будет что-то вроде метода RetrieveById (например). Он примет идентификатор и каким-то образом (это он несет ответственность за объект Mapper) построит действительный объект Customer. То же самое верно и по-другому. Когда вы вызываете метод Mapper.Update с допустимым объектом Customer, объект Mapper несет ответственность за то, чтобы все релевантные данные сохранялись (где это необходимо - db, память, файл и т.д.).
ad 2) Как я уже отмечал выше, retrieve/persist - это методы на объекте Mapper. Он несет ответственность за обеспечение такой функциональности. Поэтому LoadAll, SaveAll (возможно, передающий массив объектов значений) являются действительными методами Mapper.
ad 3) Я бы сказал "да". Но вы можете разделить различные аспекты объектов Mapper на отдельные классы (если вам нужно/нужно): значения по умолчанию, проверка правильности и т.д.
Надеюсь, это поможет. Я действительно предлагаю/рекомендую вам прочитать книгу Мартина Фаулера Шаблоны архитектуры корпоративных приложений.
Ответ 2
Я бы посоветовал вам взглянуть на инструмент O/R-mapper, прежде чем пытаться реализовать шаблон Data Mapper самостоятельно. Это сэкономит вам много времени. Популярным выбором O/R-mapper является NHibernate.
Ответ 3
Вы можете проверить iBATIS.NET как альтернативу NHibernate. Это также инструмент O/R, но я нашел его немного проще в использовании, чем NHibernate.
http://ibatis.apache.org/