/// <summary>
        /// 启动Orleans Server服务
        /// </summary>
        /// <param name="configure"></param>
        /// <param name="applicationPartTypes"></param>
        /// <param name="services"></param>
        /// <returns></returns>
        public static ISiloHost StartOrleansServer(OrleansSoliHostConfiguration configure, Type[] applicationPartTypes, IServiceCollection services)
        {
            var siloPort    = configure.SiloPort;
            var gatewayPort = configure.GatewayPort;

            var builder = new SiloHostBuilder()
                          // Grain State
                          .AddAdoNetGrainStorage(configure.OrleansStorage, options =>
            {
                options.Invariant        = Invariant;
                options.ConnectionString = configure.ClusterDatabase.ConnectionString;
                options.UseJsonFormat    = true;
            })
                          // Membership
                          .UseAdoNetClustering(options =>
            {
                options.Invariant        = Invariant;
                options.ConnectionString = configure.ClusterDatabase.ConnectionString;
            })
                          .Configure <ClusterOptions>(options =>
            {
                options.ClusterId = configure.ClusterId;
                options.ServiceId = configure.ServiceId;
            })
                          .Configure <SerializationProviderOptions>(options =>
            {
                options.SerializationProviders.Add(typeof(ProtobufSerializer).GetTypeInfo());
                options.FallbackSerializationProvider = typeof(ProtobufSerializer).GetTypeInfo();
            })
                          .ConfigureEndpoints(siloPort, gatewayPort)
                          .ConfigureApplicationParts(parts =>
            {
                if (applicationPartTypes != null)
                {
                    foreach (var type in applicationPartTypes)
                    {
                        parts.AddApplicationPart(type.Assembly).WithReferences();
                    }
                }
            })
                          .ConfigureLogging(log => log.SetMinimumLevel(LogLevel.Warning).AddConsole());

            var host = builder.Build();

            host.StartAsync().Wait();
            services.AddSingleton(host);

            Console.WriteLine("Orleans服务端已经启动");

            return(host);
        }
        /// <summary>
        /// 启动Orleans客户端服务
        /// </summary>
        /// <param name="configure"></param>
        /// <param name="applicationPartTypes"></param>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IClusterClient StartOrleansClient(OrleansSoliHostConfiguration configure, Type[] applicationPartTypes, IServiceCollection services)
        {
            var client = new ClientBuilder()
                         .UseAdoNetClustering(options =>
            {
                options.Invariant        = Invariant;
                options.ConnectionString = configure.ClusterDatabase.ConnectionString;
            })
                         .Configure <ClusterOptions>(options =>
            {
                options.ClusterId = configure.ClusterId;
                options.ServiceId = configure.ServiceId;
            })
                         .Configure <SerializationProviderOptions>(options =>
            {
                options.SerializationProviders.Add(typeof(ProtobufSerializer).GetTypeInfo());
                options.FallbackSerializationProvider = typeof(ProtobufSerializer).GetTypeInfo();
            })
                         .ConfigureApplicationParts(parts =>
            {
                if (applicationPartTypes != null)
                {
                    foreach (var type in applicationPartTypes)
                    {
                        parts.AddApplicationPart(type.Assembly);
                    }
                }
            })
                         .ConfigureLogging(log => log.SetMinimumLevel(LogLevel.Warning).AddConsole())
                         .Build();

            client.Connect(async(e) =>
            {
                Console.WriteLine($"Orleans客户端连接集群错误.  Exception: {e.ToString()}");
                await Task.Delay(TimeSpan.FromSeconds(3));
                Console.WriteLine($"Orleans客户端开始重新连接到集群.");
                return(true);
            }).Wait();

            Console.WriteLine("Orleans客户端已经启动");

            if (services != null)
            {
                services.AddSingleton(client);
            }

            return(client);
        }