public ITriggerOutcome ProcessTrigger(ITriggerInput TriggerInput) { //If triggers are not active then just return Report as False if (!_TriggersActive) { return new TriggerOutcome() { Report = false } } ; //Validate TriggerInput if (TriggerInput.CrudOperationType == RestEnum.CrudOperationType.None) { throw new System.NullReferenceException("TriggerInput.CrudOperationType cannot be None"); } if (TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Create || TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Update) { if (TriggerInput.InboundResource == null) { throw new System.NullReferenceException("TriggerInput.InboundResource cannot be null"); } } if (TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Create || TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Update || TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Delete) { if (string.IsNullOrWhiteSpace(TriggerInput.InboundResourceId)) { throw new System.NullReferenceException("TriggerInput.InboundResourceId cannot be null or empty"); } if (TriggerInput.ResourceType == ResourceType.Resource) { throw new System.NullReferenceException("TriggerInput.ResourceType cannot be equal to 'Resource'"); } } if (TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Update || TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Delete) { if (TriggerInput.DbTokenIndexList == null) { throw new System.NullReferenceException("TriggerInput.DbTokenIndexList cannot be null for Update or Delete actions"); } } ITriggerOutcome TriggerOutcomeMain = null; //Resource Specific var ResourceSpecificList = ITriggerServiceList.Where(x => x.ResourceTypeToTriggerFor == TriggerInput.ResourceType); foreach (var TriggerService in ResourceSpecificList) { TriggerOutcomeMain = CollateOutcomes(TriggerOutcomeMain, TriggerService.ProcessTrigger(TriggerInput)); } //All Resource Types ResourceSpecificList = ITriggerServiceList.Where(x => x.ResourceTypeToTriggerFor == ResourceType.Resource); foreach (var TriggerService in ResourceSpecificList) { TriggerOutcomeMain = CollateOutcomes(TriggerOutcomeMain, TriggerService.ProcessTrigger(TriggerInput)); } return(TriggerOutcomeMain); }