Ejemplo n.º 1
0
        public StatelessServiceHost(
            string serviceTypeName,
            IStatelessServiceRuntimeRegistrant serviceRuntimeRegistrant,
            IStatelessServiceHostEventSourceReplicator serviceEventSourceReplicator,
            IReadOnlyList <IStatelessServiceHostDelegateReplicator> serviceDelegateReplicators,
            IReadOnlyList <IStatelessServiceHostListenerReplicator> serviceListenerReplicators)
        {
            this.serviceTypeName = serviceTypeName
                                   ?? throw new ArgumentNullException(nameof(serviceTypeName));

            this.serviceRuntimeRegistrant = serviceRuntimeRegistrant
                                            ?? throw new ArgumentNullException(nameof(serviceRuntimeRegistrant));

            this.serviceEventSourceReplicator = serviceEventSourceReplicator
                                                ?? throw new ArgumentNullException(nameof(serviceEventSourceReplicator));

            this.serviceDelegateReplicators = serviceDelegateReplicators
                                              ?? throw new ArgumentNullException(nameof(serviceDelegateReplicators));

            this.serviceListenerReplicators = serviceListenerReplicators
                                              ?? Array.Empty <IStatelessServiceHostListenerReplicator>();
        }
        public StatelessService(
            StatelessServiceContext serviceContext,
            IStatelessServiceHostEventSourceReplicator serviceEventSourceReplicator,
            IReadOnlyList <IStatelessServiceHostDelegateReplicator> serviceDelegateReplicators,
            IReadOnlyList <IStatelessServiceHostListenerReplicator> serviceListenerReplicators)
            : base(serviceContext)
        {
            this.serviceEvents = new ServiceEvents(
                new ServiceEventBridgeCodePackage(serviceContext.CodePackageActivationContext));

            this.serviceEventSource = serviceEventSourceReplicator.ReplicateFor(this);
            if (this.serviceEventSource == null)
            {
                throw new ReplicatorProducesNullInstanceException <StatelessServiceEventSource>();
            }

            if (serviceDelegateReplicators != null)
            {
                this.serviceDelegates = serviceDelegateReplicators
                                        .SelectMany(
                    replicator =>
                {
                    var @delegate = replicator.ReplicateFor(this);
                    if (@delegate == null)
                    {
                        throw new ReplicatorProducesNullInstanceException <StatelessServiceDelegate>();
                    }

                    return(@delegate.Event.GetBitFlags().Select(v => (v, @delegate)));
                })
                                        .ToLookup(kv => kv.v, kv => kv.@delegate);
            }

            if (serviceListenerReplicators != null)
            {
                this.serviceListeners = serviceListenerReplicators
                                        .Select(
                    replicator =>
                {
                    var listener = replicator.ReplicateFor(this);
                    if (listener == null)
                    {
                        throw new ReplicatorProducesNullInstanceException <ServiceInstanceListener>();
                    }

                    return(listener);
                })
                                        .ToList();
            }

            this.serviceEvents.OnStartup += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContext(StatelessServiceLifecycleEvent.OnStartup),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.OnRun += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContext(StatelessServiceLifecycleEvent.OnRun),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.OnShutdown += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnShutdown(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnCodePackageAdded += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnCodePackageAdded(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnCodePackageModified += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnCodePackageModified(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnCodePackageRemoved += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnCodePackageRemoved(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnConfigPackageAdded += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnConfigPackageAdded(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnConfigPackageModified += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnConfigPackageModified(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnConfigPackageRemoved += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnConfigPackageRemoved(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnDataPackageAdded += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnDataPackageAdded(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnDataPackageModified += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnDataPackageModified(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
            this.serviceEvents.CodePackage.OnDataPackageRemoved += async(
                sender,
                args) =>
            {
                try
                {
                    await this.InvokeDelegates(
                        new StatelessServiceDelegateInvocationContextOnDataPackageRemoved(args.Payload),
                        args.CancellationToken);

                    args.Complete();
                }
                catch (Exception e)
                {
                    args.Fail(e);
                }
            };
        }