public async Task <ICommandResult <TEntity> > CreateAsync(TEntity model) { var result = new CommandResult <TEntity>(); // Validate if (model.Id > 0) { return(result.Failed(new CommandError($"{nameof(model.Id)} cannot be greater than zero when creating an entity"))); } if (model.FeatureId == 0) { throw new ArgumentOutOfRangeException(nameof(model.FeatureId)); } if (String.IsNullOrWhiteSpace(model.Title)) { throw new ArgumentNullException(nameof(model.Title)); } if (String.IsNullOrWhiteSpace(model.Message)) { throw new ArgumentNullException(nameof(model.Message)); } if (model.CreatedDate == null) { throw new ArgumentNullException(nameof(model.CreatedDate)); } // Parse Html and message abstract model.Html = await ParseEntityHtml(model.Message); model.Abstract = await ParseEntityAbstract(model.Message); model.Urls = await ParseEntityUrls(model.Html); model.Alias = await ParseEntityAlias(model.Title); // Parse totals model.TotalWords = model.Message.TotalWords(); // Raise creating event Creating?.Invoke(this, new EntityEventArgs <TEntity>(model)); // Invoke EntityCreating subscriptions foreach (var handler in _broker.Pub <TEntity>(this, "EntityCreating")) { model = await handler.Invoke(new Message <TEntity>(model, this)); } var entity = await _entityStore.CreateAsync(model); if (entity != null) { // Raise created event Created?.Invoke(this, new EntityEventArgs <TEntity>(entity)); // Invoke EntityCreated subscriptions foreach (var handler in _broker.Pub <TEntity>(this, "EntityCreated")) { entity = await handler.Invoke(new Message <TEntity>(entity, this)); } // Return success return(result.Success(entity)); } return(result.Failed(new CommandError("An unknown error occurred whilst attempting to create an eneity"))); }