using System; using System.Reflection; using System.Threading.Tasks; namespace Kean.Domain { /// /// 共享服务 /// public sealed class SharedService { private readonly IServiceProvider _serviceProvider; private readonly string _domain; /// /// 构造函数 /// internal SharedService(IServiceProvider serviceProvider, string domain) { _serviceProvider = serviceProvider; _domain = domain; } /// /// 获取共享服务 /// public Unit this[string index] => new(_serviceProvider, _domain, index); /// /// 共享服务单元 /// public sealed class Unit { private readonly IServiceProvider _serviceProvider; private readonly string _domain; private readonly string _service; /// /// 构造函数 /// internal Unit(IServiceProvider serviceProvider, string domain, string service) { _serviceProvider = serviceProvider; _domain = domain; _service = service; } /// /// 获取处理程序 /// /// 服务实例 private MethodInfo GetHandler(out object instance) { var assembly = $"{GetType().Namespace}.{_domain}"; var type = Type.GetType($"{assembly}.SharedServices.{_service},{assembly}"); instance = _serviceProvider.GetService(type); return type.GetMethod("Handler"); } /// /// 调用共享服务 /// /// 参数 public Task Invoke(params object[] parameters) => GetHandler(out var instance).Invoke(instance, parameters) as Task; /// /// 调用共享服务 /// /// 结果类型 /// 参数 /// 操作结果 public Task Invoke(params object[] parameters) => GetHandler(out var instance).Invoke(instance, parameters) as Task; } } }