Шаблоны Data Mapper, Repository и Unit of Work
Я узнаю о следующих шаблонах
- Data Mapper
- вместилище
- Единица работы
Я думаю, что понимаю каждого из них, но я не могу ответить на эти вопросы
- они всегда привыкли вместе?
- какой шаблон использует другие?
- какой шаблон известен по модели предметной области?
- какие операции CRUD обрабатываются каждой из них?
- кто владеет кодом базы данных (т.е. SQL)?
Благодарю.
1 ответ
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 и дешифрование электронной почты (показывать пользователю зашифрованный адрес электронной почты бессмысленно). И верните другой способ, сопоставив UserViewModel с UserDatabaseModel и зашифровав электронную почту для хранения в вашей базе данных. Mapper будет обрабатывать это за кулисами, поэтому вам не нужно постоянно беспокоиться о вызове encrypt / decrypt.
Единица работы и хранилище работают вместе. Единица работы контролирует единицу работы, поэтому, если, например, обновление пользователя фактически обновляет 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
}