public OrchestrationInfo(Process process) { this.process = process; process.Orchestrations[typeof(TRequest)] = this; var canRouteToPrefix = ReflectionServiceBuilder.GetGenericTypeNamePrefix(typeof(ICanRouteTo <>)); foreach (var i in typeof(TRequest).GetInterfaces()) { if (ReflectionServiceBuilder.GetGenericTypeNamePrefix(i) == canRouteToPrefix) { var gt = i.GenericTypeArguments; var affinityInfo = process.Affinities[gt[0]]; (Affinities ?? (Affinities = new List <IAffinityInfo>())).Add(affinityInfo); } } var method = typeof(TRequest).GetMethod("Execute"); requirelocks = method.GetCustomAttributes(typeof(LockAttribute), false).Count() > 0; if (requirelocks && (Affinities == null || Affinities.Count == 0)) { throw new BuilderException($"To use {nameof(LockAttribute)} on Execute function of {typeof(TRequest).FullName}, you must define at least one affinity."); } }
IServiceBuilder IServiceBuilder.DefineActivity <TRequest, TReturn>() { var type = typeof(TRequest); if (process.Activities.ContainsKey(type)) { return(this); } new ActivityInfo <TRequest, TReturn>(process); Placements.Add(ReflectionServiceBuilder.DefaultPlacement <TRequest>(process.Affinities.Keys)); return(this); }
// constructor for user-defined orchestration public OrchestrationInfo(Process process) { this.Process = process; process.Orchestrations[typeof(TRequest)] = this; if (typeof(IInitializationRequest).IsAssignableFrom(typeof(TRequest))) { // this is an initialization orchestration IsInitialization = true; requirelocks = true; } else { IsInitialization = false; // use reflection to obtain affinity and locking information var canRouteToPrefix = ReflectionServiceBuilder.GetGenericTypeNamePrefix(typeof(ICanRouteTo <>)); foreach (var i in typeof(TRequest).GetInterfaces()) { if (ReflectionServiceBuilder.GetGenericTypeNamePrefix(i) == canRouteToPrefix) { var gt = i.GenericTypeArguments; var affinityInfo = process.Affinities[gt[0]]; (AffinityList ?? (AffinityList = new List <IAffinityInfo>())).Add(affinityInfo); } } var method = typeof(TRequest).GetMethod("Execute"); requirelocks = method.GetCustomAttributes(typeof(LockAttribute), false).Count() > 0; if (requirelocks && (AffinityList == null || AffinityList.Count == 0)) { throw new BuilderException($"To use {nameof(LockAttribute)} on Execute function of {typeof(TRequest).FullName}, you must define at least one affinity."); } } }