/// <summary>
        /// Creates an <see cref="TenancyResult"/> indicating a failed tenancy operation, with a list of <paramref name="errors"/> if applicable.
        /// </summary>
        /// <param name="errors">An optional array of <see cref="TenancyError"/>s which caused the operation to fail.</param>
        /// <returns>An <see cref="TenancyResult"/> indicating a failed tenancy operation, with a list of <paramref name="errors"/> if applicable.</returns>
        public static TenancyResult Failed(params TenancyError[] errors)
        {
            var result = new TenancyResult {
                Succeeded = false
            };

            if (errors != null)
            {
                result._errors.AddRange(errors);
            }
            return(result);
        }
 /// <summary>
 /// Should return <see cref="TenancyResult.Success"/> if validation is successful. This is
 /// called before saving the tenant via Create or Update.
 /// </summary>
 /// <param name="tenant">The tenant</param>
 /// <returns>A <see cref="TenancyResult"/> representing whether validation was successful.</returns>
 protected async Task<TenancyResult> ValidateTenantAsync(TTenant tenant)
 {
     var errors = new List<TenancyError>();
     foreach (var v in TenantValidators)
     {
         var result = await v.ValidateAsync(this, tenant);
         if (!result.Succeeded)
         {
             errors.AddRange(result.Errors);
         }
     }
     if (errors.Count > 0)
     {
         Logger.LogWarning(13, "Tenant {tenantId} validation failed: {errors}.", await GetTenantIdAsync(tenant), string.Join(";", errors.Select(e => e.Code)));
         return TenancyResult.Failed(errors.ToArray());
     }
     return TenancyResult.Success;
 }