using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Orleans; using Orleans.Hosting; using Orleans.Statistics; using Serilog; using System; namespace Kean.Infrastructure.Orleans { /// /// ServiceCollection 扩展方法 /// public static class ServiceCollectionExtensions { /// /// 向服务描述中追加 Orleans 配置 /// /// 服务描述符 /// 配置项 /// 服务描述符 public static IServiceCollection AddOrleans(this IServiceCollection services, Action setupAction) { var orleansOptions = new OrleansOptions(); setupAction(orleansOptions); var siloHost = new SiloHostBuilder() .ConfigureServices(orleansOptions.ConfigureDelegate) .ConfigureLogging((hostBuilderContext, loggingBuilder) => { loggingBuilder.AddSerilog(); loggingBuilder.AddConfiguration(hostBuilderContext.Configuration); }) .UseLocalhostClustering( siloPort: orleansOptions.SiloPort, gatewayPort: orleansOptions.GatewayPort, serviceId: orleansOptions.ServiceId, clusterId: orleansOptions.ClusterId ) .UseRedisClustering(redisClusteringOptions => { redisClusteringOptions.ConnectionString = orleansOptions.RedisClustering.ConnectionString; redisClusteringOptions.Database = orleansOptions.RedisClustering.Database; }) .UseDashboard(dashboardOptions => dashboardOptions.HostSelf = false) .UsePerfCounterEnvironmentStatistics() .Build(); var client = siloHost.Services.GetRequiredService(); return services .AddHostedService(serviceProvider => new HostedService(siloHost)) .AddServicesForSelfHostedDashboard() .AddDashboardEmbeddedFiles() .AddSingleton(client) .AddSingleton(client); } } }