public StoreAbstractDTO AddStore(StoreAddDTO newStoreDto) { if (!Enum.IsDefined(typeof(StoreType), newStoreDto.StoreType)) throw new ValidateException(new ValidationResult() { Code = "InvalidStoreType", Message = "Invalid value for store type" }); var newStore = new Store() { Name = newStoreDto.Name, Description = newStoreDto.Description, StoreType = (StoreType)newStoreDto.StoreType, State = StoreState.Activated }; //Create store details var storeLocalizedDetailsService = storeLocalizedDetailsServiceFactory. Create(newStoreDto.StoreLocalizedDetails.CountryCodeISOA2); var storeLocalizedDetails = storeLocalizedDetailsService. CreateFrom((StoreLocalizedDetailsBaseDto)newStoreDto.StoreLocalizedDetails.Content); newStore.StoreLocalizedDetails = storeLocalizedDetails; //Create store addresses foreach (var addressDto in newStoreDto.Addresses) { var addressService = addressServiceFactory.Create(addressDto.CountryCodeISOA2); var address = addressService.CreateFrom((AddressBaseDto)addressDto.Content); newStore.Addresses.Add(address); } //Create store phone numbers foreach (var phoneNumberDto in newStoreDto.PhoneNumbers) { var phoneNumbersService = phoneNumberServiceFactory.Create(phoneNumberDto.CountryCodeISOA2); var phoneNumber = phoneNumbersService.CreateFrom((PhoneNumberBaseDto)phoneNumberDto.Content); newStore.PhoneNumbers.Add(phoneNumber); } var validation = validationFactory.Create<Store>(); var validationResult = validation.Validate(newStore); if (validationResult.Any()) throw new ValidateException(validationResult); storeRepository.Add(newStore); return newStore.ProjectedAs<StoreAbstractDTO>(typeAdapterFactory.Create()); }