|
@ -7,20 +7,51 @@ namespace CoreAgent.Domain.Contexts; |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 蜂窝网络领域上下文
|
|
|
/// 蜂窝网络领域上下文
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
public class CellularNetworkContext |
|
|
public class CellularNetworkContext : IDisposable |
|
|
{ |
|
|
{ |
|
|
private static readonly Lazy<CellularNetworkContext> _instance = new(() => new CellularNetworkContext()); |
|
|
private static readonly Lazy<CellularNetworkContext> _instance = new(() => new CellularNetworkContext()); |
|
|
private readonly object _lock = new(); |
|
|
private readonly object _lock = new(); |
|
|
private readonly Dictionary<string, CellularNetworkState> _networkStates = new(); |
|
|
private CellularNetworkState _networkState; |
|
|
private NetworkCommandConfig _networkCommandConfig; |
|
|
private NetworkCommandConfig _networkCommandConfig; |
|
|
private string NeConfigKey; |
|
|
private string _neConfigKey = string.Empty; |
|
|
public CancellationTokenSource token = new CancellationTokenSource(); |
|
|
public CancellationTokenSource token = new CancellationTokenSource(); |
|
|
|
|
|
private bool _isDisposed; |
|
|
|
|
|
private bool _isInitialized; |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 获取单例实例
|
|
|
/// 获取单例实例
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
public static CellularNetworkContext Instance => _instance.Value; |
|
|
public static CellularNetworkContext Instance => _instance.Value; |
|
|
|
|
|
|
|
|
private CellularNetworkContext() { } |
|
|
private CellularNetworkContext() |
|
|
|
|
|
{ |
|
|
|
|
|
_isDisposed = false; |
|
|
|
|
|
_isInitialized = false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化上下文
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="config">网络命令配置</param>
|
|
|
|
|
|
public void Initialize(NetworkCommandConfig config = null) |
|
|
|
|
|
{ |
|
|
|
|
|
lock (_lock) |
|
|
|
|
|
{ |
|
|
|
|
|
if (_isDisposed) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new ObjectDisposedException(nameof(CellularNetworkContext)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (_isInitialized) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_networkState = new CellularNetworkState(_neConfigKey); |
|
|
|
|
|
_networkCommandConfig = config; |
|
|
|
|
|
_isInitialized = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 设置网络命令配置
|
|
|
/// 设置网络命令配置
|
|
@ -30,6 +61,16 @@ public class CellularNetworkContext |
|
|
{ |
|
|
{ |
|
|
lock (_lock) |
|
|
lock (_lock) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if (_isDisposed) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new ObjectDisposedException(nameof(CellularNetworkContext)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!_isInitialized) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new InvalidOperationException("上下文未初始化,请先调用Initialize方法"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
_networkCommandConfig = config ?? throw new ArgumentNullException(nameof(config)); |
|
|
_networkCommandConfig = config ?? throw new ArgumentNullException(nameof(config)); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -42,7 +83,17 @@ public class CellularNetworkContext |
|
|
{ |
|
|
{ |
|
|
lock (_lock) |
|
|
lock (_lock) |
|
|
{ |
|
|
{ |
|
|
return _networkCommandConfig ?? throw new InvalidOperationException("网络命令配置未初始化"); |
|
|
if (_isDisposed) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new ObjectDisposedException(nameof(CellularNetworkContext)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!_isInitialized) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new InvalidOperationException("上下文未初始化"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return _networkCommandConfig ?? throw new InvalidOperationException("网络命令配置未设置"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -50,7 +101,18 @@ public class CellularNetworkContext |
|
|
{ |
|
|
{ |
|
|
lock (_lock) |
|
|
lock (_lock) |
|
|
{ |
|
|
{ |
|
|
return NeConfigKey= key ?? throw new ArgumentNullException(nameof(key)); |
|
|
if (_isDisposed) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new ObjectDisposedException(nameof(CellularNetworkContext)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!_isInitialized) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new InvalidOperationException("上下文未初始化"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_neConfigKey = key ?? throw new ArgumentNullException(nameof(key)); |
|
|
|
|
|
return _neConfigKey; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -58,9 +120,20 @@ public class CellularNetworkContext |
|
|
{ |
|
|
{ |
|
|
lock (_lock) |
|
|
lock (_lock) |
|
|
{ |
|
|
{ |
|
|
return NeConfigKey; |
|
|
if (_isDisposed) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new ObjectDisposedException(nameof(CellularNetworkContext)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!_isInitialized) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new InvalidOperationException("上下文未初始化"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return _neConfigKey; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 获取指定类型的命令配置
|
|
|
/// 获取指定类型的命令配置
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
@ -87,44 +160,71 @@ public class CellularNetworkContext |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 获取或创建网络状态
|
|
|
/// 获取网络状态
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="NeConfigKey">网络接口名称</param>
|
|
|
|
|
|
/// <returns>网络状态</returns>
|
|
|
/// <returns>网络状态</returns>
|
|
|
public CellularNetworkState GetOrCreateNetworkState(string NeConfigKey) |
|
|
public CellularNetworkState GetNetworkState() |
|
|
{ |
|
|
{ |
|
|
lock (_lock) |
|
|
lock (_lock) |
|
|
{ |
|
|
{ |
|
|
if (!_networkStates.TryGetValue(NeConfigKey, out var state)) |
|
|
if (_isDisposed) |
|
|
{ |
|
|
{ |
|
|
state = new CellularNetworkState(NeConfigKey); |
|
|
throw new ObjectDisposedException(nameof(CellularNetworkContext)); |
|
|
_networkStates[NeConfigKey] = state; |
|
|
|
|
|
} |
|
|
} |
|
|
return state; |
|
|
|
|
|
|
|
|
if (!_isInitialized) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new InvalidOperationException("上下文未初始化"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return _networkState ?? throw new InvalidOperationException("网络状态未初始化"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 移除网络状态
|
|
|
/// 重置上下文状态
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="NeConfigKey">网络接口名称</param>
|
|
|
public void Reset() |
|
|
public void RemoveNetworkState(string NeConfigKey) |
|
|
|
|
|
{ |
|
|
{ |
|
|
lock (_lock) |
|
|
lock (_lock) |
|
|
{ |
|
|
{ |
|
|
_networkStates.Remove(NeConfigKey); |
|
|
if (_isDisposed) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new ObjectDisposedException(nameof(CellularNetworkContext)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!_isInitialized) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
token.Cancel(); |
|
|
|
|
|
token = new CancellationTokenSource(); |
|
|
|
|
|
_networkState = new CellularNetworkState(_neConfigKey); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 获取所有网络状态
|
|
|
/// 释放资源
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <returns>所有网络状态的集合</returns>
|
|
|
public void Dispose() |
|
|
public IReadOnlyCollection<CellularNetworkState> GetAllNetworkStates() |
|
|
{ |
|
|
|
|
|
if (_isDisposed) |
|
|
{ |
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
lock (_lock) |
|
|
lock (_lock) |
|
|
{ |
|
|
{ |
|
|
return _networkStates.Values.ToList().AsReadOnly(); |
|
|
if (_isDisposed) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
token.Cancel(); |
|
|
|
|
|
token.Dispose(); |
|
|
|
|
|
_isInitialized = false; |
|
|
|
|
|
_isDisposed = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|