Data Mapper будет отображать объекты вашей базы данных в объекты реального мира, используемые в вашем приложении, и обратно в другую сторону (от реальных рабочих объектов до объектов базы данных). Вы использовали бы это, поскольку у вас могут быть свойства в вашей базе данных, которые вы не хотите показывать за пределами своего приложения. Примером может быть созданная дата, временная метка или зашифрованное значение в базе данных. Так что ваши модели могут выглядеть как
UserDatabaseModel (This is whats in your database)
Id
Name
Email (stored encrypted in the database)
CreatedDate
Timestamp
UserViewModel (This is what you want to show your user)
Id
Name (shown not encrypted)
Email
Вашего картограф будет нести ответственность за картографирования в UserDatabaseModel к UserViewModel и unencrypting электронной почты (с указанием шифрованного адреса электронной почты, чтобы пользователь не имеет смысла). И наоборот, сопоставление UserViewModel с UserDatabaseModel и шифрование электронной почты для хранения в вашей базе данных. Mapper справится с этим за кулисами, поэтому вам не придется беспокоиться о том, чтобы все время шифровать/расшифровывать.
Единица работы и хранилище работают вместе. Единица работы контролирует единицу работы, поэтому, если, например, обновление пользователя фактически обновляет 2 таблицы в вашей базе данных, вы хотите сохранить данные только в том случае, если обе таблицы сохраняются. Вы переносите это в свою единицу работы (например, транзакцию в sql). Ваш репозиторий отвечает за CRUD или любые другие действия с базой данных. Вы определяете код, который получает пользователя из базы данных или обновляет пользователя в вашем репозитории.
Так обновления базы данных из кода может выглядеть примерно так:
try{
uow = new UnitOfWork //start a new database transaction
repo = new UserRepository
repo.UpdateUser //calls database
repo.UpdateUserAddress //calls database
uow.Save //commit the database transaction
} catch {
uow.Rollback //something went wrong, rollback transaction
}