Обновить значения объекта, которые изменились - PullRequest
1 голос
/ 18 марта 2019

В настоящее время у меня есть следующая ситуация:

В моем приложении есть раздел профиля, где пользователи могут обновлять данные своего профиля.Поэтому у меня есть форма MVC, где пользователи могут добавлять дополнительную информацию или изменять свои данные.В моей функции отправки формы я получаю пользовательский объект, который в основном заполнен, но не полностью (некоторые значения являются нулевыми, потому что я использую службу идентификации и я не хочу, чтобы пользователь, например, изменил хэш пароля).

Теперь вот мой вопрос:

Как я могу обновить свой пользовательский объект, не написав что-то вроде этого: (profileData.User - представленный пользователь)

var user = await _userManager.FindByIdAsync(profileData.User.Id);
user.Email = profileData.User.Email;
user.Salutation = profileData.User.Salutation;
user.FirstName = profileData.User.FirstName;
user.LastName = profileData.User.LastName;
...
var result = await _userManager.UpdateAsync(user);

Я, очевидно,не может использовать это, так как это переопределит все поля, которые не установлены в представленном пользователе:

var user = profileData.User

Есть ли способ обновить мой пользовательский объект без переопределения всех полей?

1 Ответ

0 голосов
/ 18 марта 2019

Одна из веских причин для использования DTO заключается в том, что вы можете иметь разные для каждой пары функций get / update.Вместо того, чтобы иметь одну универсальную функцию обновления, почему бы не иметь функцию, которая будет обновлять свойства, которые вы можете изменить в каждой форме.Да, у вас будет множество классов и функций, но вы также сможете легко тестировать одноразовые функции, которые хорошо справляются с одной задачей (и вы не получаете проблем, о которых вы спрашиваете).

var user = await _userManager.FindByIdAsync(profileData.User.Id);
user.Email = profileData.User.Email;
user.Salutation = profileData.User.Salutation;
user.FirstName = profileData.User.FirstName;
user.LastName = profileData.User.LastName;

var result = await _userManager.UpdateProfileAsync(user); <-- Only updates the 'profile' fields

Я бы также сказал, что FindByIdAsync не должен возвращать пароль / соль и т. Д. Возможно, у вас должна быть функция FindProfileByIdAsync.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...