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.");
                }
            }
        }