山东雷驰
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

78 lines
2.5 KiB

using System;
using System.Reflection;
using System.Threading.Tasks;
namespace Kean.Domain
{
/// <summary>
/// 共享服务
/// </summary>
public sealed class SharedService
{
private readonly IServiceProvider _serviceProvider;
private readonly string _domain;
/// <summary>
/// 构造函数
/// </summary>
internal SharedService(IServiceProvider serviceProvider, string domain)
{
_serviceProvider = serviceProvider;
_domain = domain;
}
/// <summary>
/// 获取共享服务
/// </summary>
public Unit this[string index] =>
new(_serviceProvider, _domain, index);
/// <summary>
/// 共享服务单元
/// </summary>
public sealed class Unit
{
private readonly IServiceProvider _serviceProvider;
private readonly string _domain;
private readonly string _service;
/// <summary>
/// 构造函数
/// </summary>
internal Unit(IServiceProvider serviceProvider, string domain, string service)
{
_serviceProvider = serviceProvider;
_domain = domain;
_service = service;
}
/// <summary>
/// 获取处理程序
/// </summary>
/// <param name="instance">服务实例</param>
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");
}
/// <summary>
/// 调用共享服务
/// </summary>
/// <param name="parameters">参数</param>
public Task Invoke(params object[] parameters) =>
GetHandler(out var instance).Invoke(instance, parameters) as Task;
/// <summary>
/// 调用共享服务
/// </summary>
/// <typeparam name="T">结果类型</typeparam>
/// <param name="parameters">参数</param>
/// <returns>操作结果</returns>
public Task<T> Invoke<T>(params object[] parameters) =>
GetHandler(out var instance).Invoke(instance, parameters) as Task<T>;
}
}
}