using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Grpc.Core;
using Grpc.Extension.BaseService.Model;
using System.Linq;
using Grpc.Extension.Common;
using Microsoft.Extensions.DependencyInjection;
using TEAMModelOS.SDK.Extension;
using System.Text.Json;
namespace Grpc.Extension.BaseService
{
///
/// Grpc元数据服务
///
public class MetaServiceAspnetCore : IGrpcBaseService
{
private readonly IServiceProvider _serviceProvider;
public MetaServiceAspnetCore(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
///
/// 服务基本信息
///
public Task Info(InfoRQ rq, ServerCallContext context)
{
return Task.Run(() =>
{
var methods = MetaModel.Methods.Select(q => q.FullName?.Trim()).ToList();
if (!string.IsNullOrWhiteSpace(rq.MethodName))
{
methods = methods?.Where(q => q.ToLower().Contains(rq.MethodName.Trim().ToLower())).ToList();
}
var methodInfos = new List();
foreach (var m in methods)
{
var info = new GrpcMethodInfo { Name = m };
info.IsThrottled = ThrottleManager.Instance.IsThrottled(m);
info.SaveResponseEnable = MonitorManager.Instance.SaveResponseMethodEnable(m);
methodInfos.Add(info);
}
return new InfoRS
{
IpAndPort = $"{MetaModel.Ip}:{MetaModel.Port}",
StartTime = MetaModel.StartTime.ToUnixTimestamp(),
MethodInfos = methodInfos
};
});
}
///
/// 服务方法的详细信息
///
public Task MethodInfo(MethodInfoRQ rq, ServerCallContext context)
{
return Task.Run(() =>
{
var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
if (methodInfo == null)
{
return new MethodInfoRS();
}
return new MethodInfoRS
{
RequestJson = Activator.CreateInstance(methodInfo.RequestType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false }),
ResponseJson = Activator.CreateInstance(methodInfo.ResponseType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false })
};
});
}
//TODO 此段代碼後續檢視(重複方法)
///
/// 服务方法调用
///
//public Task MethodInvoke(MethodInvokeRQ rq, ServerCallContext context)
//{
// return Task.Run(() =>
// {
// var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
// if (methodInfo == null)
// {
// return new MethodInvokeRS() { ResponseJson = $"not fount method by fullname:{rq.FullName}" };
// }
// var service = ActivatorUtilities.CreateInstance(_serviceProvider, methodInfo.ServiceType);
// var task = (Task)methodInfo.Handler.DynamicInvoke(service, rq.RequestJson?.Trim().FromJson(methodInfo.RequestType), context);
// task.Wait();
// dynamic result = task;
// return new MethodInvokeRS { ResponseJson = ((object)result.Result).ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false });
// });
//}
}
}