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;
}
}
}