public IAccount GetOrCreate(AccountName accountName) { lock (_gate) { AccountDomainObjectVersion accountLatestVersion; if (Accounts.TryGetValue(accountName, out accountLatestVersion)) { if (_accountCurrentVersion != null && _accountCurrentVersion.IsChildOf(accountLatestVersion)) { return(_accountCurrentVersion.Account); } _accountCurrentVersion = accountLatestVersion.CreateChildVersion(); } else { var account = _accountRepository.GetBy(accountName) ?? _accountRepository.Add(accountName); var newAccountVersion = AccountDomainObjectVersion.Root(account); Accounts[accountName] = newAccountVersion; _accountCurrentVersion = newAccountVersion.CreateChildVersion(); } } return(_accountCurrentVersion.Account); }