47 lines
1.8 KiB
C#
47 lines
1.8 KiB
C#
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Grpc.Net.Client;
|
|
using MagicOnion.Client;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace DysonNetwork.Shared.Etcd
|
|
{
|
|
public static class EtcdServiceExtensions
|
|
{
|
|
public static IServiceCollection AddEtcdService(this IServiceCollection services, IConfiguration configuration)
|
|
{
|
|
var etcdConnectionString = configuration.GetConnectionString("Etcd");
|
|
services.AddSingleton<IEtcdService>(new EtcdService(etcdConnectionString!));
|
|
return services;
|
|
}
|
|
|
|
public static IServiceCollection AddMagicOnionService<TService>(this IServiceCollection services)
|
|
where TService : class, MagicOnion.IService<TService>
|
|
{
|
|
services.AddSingleton(serviceProvider =>
|
|
{
|
|
var etcdService = serviceProvider.GetRequiredService<IEtcdService>();
|
|
var serviceName = typeof(TService).Name.TrimStart('I'); // Convention: IMyService -> MyService
|
|
|
|
// Synchronously wait for service discovery (or handle asynchronously if preferred)
|
|
var endpoints = etcdService.DiscoverServicesAsync(serviceName).GetAwaiter().GetResult();
|
|
|
|
if (!endpoints.Any())
|
|
{
|
|
throw new InvalidOperationException($"No endpoints found for MagicOnion service: {serviceName}");
|
|
}
|
|
|
|
// For simplicity, use the first discovered endpoint
|
|
var endpoint = endpoints.First();
|
|
|
|
var channel = GrpcChannel.ForAddress(endpoint);
|
|
return MagicOnionClient.Create<TService>(channel);
|
|
});
|
|
|
|
return services;
|
|
}
|
|
}
|
|
}
|