Вы уверены, что это хорошая идея, что у вас есть разные идентификаторы контактов локально и удаленно? Мне кажется это неправильным, но, может быть, я просто не знаю ваш домен.
В моем приложении все новые контакты отправляются через веб-сервис на удаленный портал и сохраняются там. Поэтому, когда я сохраняю новый контакт локально, он отправляется на удаленный портал и сохраняется там. Может быть, вам нужно то же самое?
Если вышеприведенные мысли для вас неприемлемы, то я бы сделал это так:
class ServiceFacadeImpl {
public void CreatePortalAccountAndSaveContact(Contact contact) {
try
{
contact.portalAccount = this.portalService.createPortalAccount(contact);
this.contactDAO.save(contact);
}
catch(...)
{
// do cleanup, for example do you need to delete account from remote
// portal if it couldn't be saved locally?
// If yes, delete it from portal and set contact.portalAccount = null;
}
}
}
Некоторые могут сказать, что CreatePortalAccountAndSaveContact нарушает принцип единой ответственности, но imo в этой ситуации абсолютно нормально, потому что, как я понимаю, эта операция должна быть атомарной. Правильно?
Или вы можете добавить логический флаг к методу, указывающий, хотите ли вы сохранить контакт. Но если вам всегда нужно сохранять контакт с PortalAccount сразу после получения его с удаленного портала - тогда логический флаг не нужен.
PS. Почему вы используете это ключевое слово? Является ли portalService частным участником? Если да, то, возможно, вам нужно пересмотреть свое соглашение об именах и назвать частных членов, например, с префиксом «_» (я думаю, что он самый популярный), например, _portalService - тогда будет легко понять, что _portalService является частным членом. Извините за оффтоп.
Удачи.