重新设计接口类,将流程运行环境和IOC解耦

This commit is contained in:
fengjiayi
2025-06-02 16:38:37 +08:00
parent a43c611d72
commit b1dc641c84
14 changed files with 2874 additions and 3045 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,710 +0,0 @@
using Serein.Library;
using Serein.Library.Api;
using Serein.Library.FlowNode;
using Serein.Library.Utils;
using Serein.NodeFlow.Tool;
using System.Reflection;
namespace Serein.NodeFlow.Env
{
/// <summary>
/// 自动管理本地与远程的环境
/// </summary>
public class FlowEnvironmentDecorator : IFlowEnvironment, IFlowEnvironmentEvent, ISereinIOC
{
public FlowEnvironmentDecorator()
{
flowEnvironment = new FlowEnvironment();
// 默认使用本地环境
currentFlowEnvironment = flowEnvironment;
currentFlowEnvironmentEvent = flowEnvironment;
SereinEnv.SetEnv(currentFlowEnvironment);
}
/// <summary>
/// 本地环境
/// </summary>
private readonly FlowEnvironment flowEnvironment;
/// <summary>
/// 远程环境
/// </summary>
private RemoteFlowEnvironment remoteFlowEnvironment;
/// <summary>
/// 本地环境事件
/// </summary>
private readonly IFlowEnvironmentEvent flowEnvironmentEvent;
/// <summary>
/// 远程环境事件
/// </summary>
private IFlowEnvironmentEvent remoteFlowEnvironmentEvent;
/// <summary>
/// 管理当前环境
/// </summary>
private IFlowEnvironment currentFlowEnvironment;
/// <summary>
/// 管理当前环境事件
/// </summary>
private IFlowEnvironmentEvent currentFlowEnvironmentEvent;
private int _loadingProjectFlag = 0; // 使用原子自增代替锁
/// <summary>
/// 传入false时将停止数据通知。传入true时
/// </summary>
/// <param name="value"></param>
public void SetProjectLoadingFlag(bool value)
{
Interlocked.Exchange(ref _loadingProjectFlag, value ? 1 : 0);
}
/// <summary>
/// 判断是否正在加载项目
/// </summary>
/// <returns></returns>
public bool IsLoadingProject()
{
return Interlocked.CompareExchange(ref _loadingProjectFlag, 1, 1) == 1;
}
/// <summary>
/// 当前环境,用于切换远程与本地环境
/// </summary>
public IFlowEnvironment CurrentEnv { get => currentFlowEnvironment; }
public UIContextOperation UIContextOperation => currentFlowEnvironment.UIContextOperation;
/// <summary>
/// 节点视图模型管理类
/// </summary>
public NodeMVVMManagement NodeMVVMManagement => currentFlowEnvironment.NodeMVVMManagement;
public ISereinIOC IOC => (ISereinIOC)currentFlowEnvironment;
public string EnvName => currentFlowEnvironment.EnvName;
public string ProjectFileLocation => currentFlowEnvironment.EnvName;
public bool IsGlobalInterrupt => currentFlowEnvironment.IsGlobalInterrupt;
public bool IsControlRemoteEnv => currentFlowEnvironment.IsControlRemoteEnv;
/// <summary>
/// 信息输出等级
/// </summary>
public InfoClass InfoClass { get => currentFlowEnvironment.InfoClass; set => currentFlowEnvironment.InfoClass = value; }
public RunState FlowState { get => currentFlowEnvironment.FlowState; set => currentFlowEnvironment.FlowState = value; }
//public RunState FlipFlopState { get => currentFlowEnvironment.FlipFlopState; set => currentFlowEnvironment.FlipFlopState = value; }
public event LoadDllHandler OnDllLoad {
add { currentFlowEnvironmentEvent.OnDllLoad += value; }
remove { currentFlowEnvironmentEvent.OnDllLoad -= value; }
}
public event ProjectLoadedHandler OnProjectLoaded
{
add { currentFlowEnvironmentEvent.OnProjectLoaded += value; }
remove { currentFlowEnvironmentEvent.OnProjectLoaded -= value; }
}
/// <summary>
/// 项目准备保存
/// </summary>
public event ProjectSavingHandler? OnProjectSaving
{
add { currentFlowEnvironmentEvent.OnProjectSaving += value; }
remove { currentFlowEnvironmentEvent.OnProjectSaving -= value; }
}
public event NodeConnectChangeHandler OnNodeConnectChange
{
add { currentFlowEnvironmentEvent.OnNodeConnectChange += value; }
remove { currentFlowEnvironmentEvent.OnNodeConnectChange -= value; }
}
public event CanvasCreateHandler OnCanvasCreate
{
add { currentFlowEnvironmentEvent.OnCanvasCreate += value; }
remove { currentFlowEnvironmentEvent.OnCanvasCreate -= value; }
}
public event CanvasRemoveHandler OnCanvasRemove
{
add { currentFlowEnvironmentEvent.OnCanvasRemove += value; }
remove { currentFlowEnvironmentEvent.OnCanvasRemove -= value; }
}
public event NodeCreateHandler OnNodeCreate
{
add { currentFlowEnvironmentEvent.OnNodeCreate += value; }
remove { currentFlowEnvironmentEvent.OnNodeCreate -= value; }
}
public event NodeRemoveHandler OnNodeRemove
{
add { currentFlowEnvironmentEvent.OnNodeRemove += value; }
remove { currentFlowEnvironmentEvent.OnNodeRemove -= value; }
}
public event NodePlaceHandler OnNodePlace
{
add { currentFlowEnvironmentEvent.OnNodePlace += value; }
remove { currentFlowEnvironmentEvent.OnNodePlace -= value; }
}
public event NodeTakeOutHandler OnNodeTakeOut
{
add { currentFlowEnvironmentEvent.OnNodeTakeOut += value; }
remove { currentFlowEnvironmentEvent.OnNodeTakeOut -= value; }
}
public event StartNodeChangeHandler OnStartNodeChange
{
add { currentFlowEnvironmentEvent.OnStartNodeChange += value; }
remove { currentFlowEnvironmentEvent.OnStartNodeChange -= value; }
}
public event FlowRunCompleteHandler OnFlowRunComplete
{
add { currentFlowEnvironmentEvent.OnFlowRunComplete += value; }
remove { currentFlowEnvironmentEvent.OnFlowRunComplete -= value; }
}
public event MonitorObjectChangeHandler OnMonitorObjectChange
{
add { currentFlowEnvironmentEvent.OnMonitorObjectChange += value; }
remove { currentFlowEnvironmentEvent.OnMonitorObjectChange -= value; }
}
public event NodeInterruptStateChangeHandler OnNodeInterruptStateChange
{
add { currentFlowEnvironmentEvent.OnNodeInterruptStateChange += value; }
remove { currentFlowEnvironmentEvent.OnNodeInterruptStateChange -= value; }
}
public event ExpInterruptTriggerHandler OnInterruptTrigger
{
add { currentFlowEnvironmentEvent.OnInterruptTrigger += value; }
remove { currentFlowEnvironmentEvent.OnInterruptTrigger -= value; }
}
public event IOCMembersChangedHandler OnIOCMembersChanged
{
add { currentFlowEnvironmentEvent.OnIOCMembersChanged += value; }
remove { currentFlowEnvironmentEvent.OnIOCMembersChanged -= value; }
}
public event NodeLocatedHandler OnNodeLocated
{
add { currentFlowEnvironmentEvent.OnNodeLocated += value; }
remove { currentFlowEnvironmentEvent.OnNodeLocated -= value; }
}
public event NodeMovedHandler OnNodeMoved
{
add { currentFlowEnvironmentEvent.OnNodeMoved += value; }
remove { currentFlowEnvironmentEvent.OnNodeMoved -= value; }
}
public event EnvOutHandler OnEnvOut
{
add { currentFlowEnvironmentEvent.OnEnvOut += value; }
remove { currentFlowEnvironmentEvent.OnEnvOut -= value; }
}
public void ActivateFlipflopNode(string nodeGuid)
{
currentFlowEnvironment.ActivateFlipflopNode(nodeGuid);
}
/// <summary>
/// 增加画布
/// </summary>
/// <param name="canvasName">画布名称</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <returns></returns>
public async Task<FlowCanvasDetailsInfo> CreateCanvasAsync(string canvasName, int width, int height)
{
return await currentFlowEnvironment.CreateCanvasAsync(canvasName, width, height);
}
/// <summary>
/// 删除画布
/// </summary>
/// <param name="canvasGuid">画布Guid</param>
/// <returns></returns>
public async Task<bool> RemoveCanvasAsync(string canvasGuid)
{
return await currentFlowEnvironment.RemoveCanvasAsync(canvasGuid);
}
/// <summary>
/// 在两个节点之间创建连接关系
/// </summary>
/// <param name="fromNodeGuid">起始节点Guid</param>
/// <param name="toNodeGuid">目标节点Guid</param>
/// <param name="fromNodeJunctionType">起始节点控制点</param>
/// <param name="toNodeJunctionType">目标节点控制点</param>
/// <param name="invokeType">决定了方法执行后的后继行为</param>
public async Task<bool> ConnectInvokeNodeAsync(string canvasGuid,
string fromNodeGuid,
string toNodeGuid,
JunctionType fromNodeJunctionType,
JunctionType toNodeJunctionType,
ConnectionInvokeType invokeType)
{
return await currentFlowEnvironment.ConnectInvokeNodeAsync(canvasGuid, fromNodeGuid, toNodeGuid, fromNodeJunctionType, toNodeJunctionType, invokeType);
}
/// <summary>
/// 在两个节点之间创建连接关系
/// </summary>
/// <param name="fromNodeGuid">起始节点Guid</param>
/// <param name="toNodeGuid">目标节点Guid</param>
/// <param name="fromNodeJunctionType">起始节点控制点</param>
/// <param name="toNodeJunctionType">目标节点控制点</param>
/// <param name="argSourceType">决定了方法参数来源</param>
/// <param name="argIndex">设置第几个参数</param>
public async Task<bool> ConnectArgSourceNodeAsync(string canvasGuid,
string fromNodeGuid,
string toNodeGuid,
JunctionType fromNodeJunctionType,
JunctionType toNodeJunctionType,
ConnectionArgSourceType argSourceType,
int argIndex)
{
return await currentFlowEnvironment.ConnectArgSourceNodeAsync(canvasGuid, fromNodeGuid, toNodeGuid, fromNodeJunctionType, toNodeJunctionType, argSourceType, argIndex);
}
/// <summary>
/// 连接远程环境并自动切换环境
/// </summary>
/// <param name="addres"></param>
/// <param name="port"></param>
/// <param name="token"></param>
/// <returns></returns>
public async Task<(bool, RemoteMsgUtil)> ConnectRemoteEnv(string addres, int port, string token)
{
// 连接成功,切换远程环境
(var isConnect, var remoteMsgUtil) = await currentFlowEnvironment.ConnectRemoteEnv(addres, port, token);
if (isConnect)
{
remoteFlowEnvironment ??= new RemoteFlowEnvironment(remoteMsgUtil, this.UIContextOperation);
currentFlowEnvironment = remoteFlowEnvironment;
}
return (isConnect, remoteMsgUtil);
}
/// <summary>
/// 从节点信息集合批量加载节点控件
/// </summary>
/// <param name="List<NodeInfo>">节点信息</param>
/// <param name="position">需要加载的位置</param>
/// <returns></returns>
public async Task LoadNodeInfosAsync(List<NodeInfo> nodeInfos)
{
SetProjectLoadingFlag(false);
await currentFlowEnvironment.LoadNodeInfosAsync(nodeInfos); // 装饰器调用
SetProjectLoadingFlag(true);
}
public async Task<NodeInfo> CreateNodeAsync(string canvasGuid, NodeControlType nodeBase, PositionOfUI position, MethodDetailsInfo methodDetailsInfo = null)
{
SetProjectLoadingFlag(false);
var result = await currentFlowEnvironment.CreateNodeAsync(canvasGuid, nodeBase, position, methodDetailsInfo); // 装饰器调用
SetProjectLoadingFlag(true);
return result;
}
/// <summary>
/// 将节点放置在容器中
/// </summary>
/// <returns></returns>
public async Task<bool> PlaceNodeToContainerAsync(string canvasGuid, string nodeGuid, string containerNodeGuid)
{
SetProjectLoadingFlag(false);
var result = await currentFlowEnvironment.PlaceNodeToContainerAsync(canvasGuid, nodeGuid, containerNodeGuid); // 装饰器调用
SetProjectLoadingFlag(true);
return result;
}
/// <summary>
/// 将节点从容器中脱离
/// </summary>
/// <returns></returns>
public async Task<bool> TakeOutNodeToContainerAsync(string canvasGuid, string nodeGuid)
{
SetProjectLoadingFlag(false);
var result = await currentFlowEnvironment.TakeOutNodeToContainerAsync(canvasGuid,nodeGuid); // 装饰器调用
SetProjectLoadingFlag(true);
return result;
}
public async Task<bool> ExitFlowAsync()
{
return await currentFlowEnvironment.ExitFlowAsync();
}
public void ExitRemoteEnv()
{
currentFlowEnvironment.ExitRemoteEnv();
}
public async Task<FlowEnvInfo> GetEnvInfoAsync()
{
return await currentFlowEnvironment.GetEnvInfoAsync();
}
public async Task<SereinProjectData> GetProjectInfoAsync()
{
return await currentFlowEnvironment.GetProjectInfoAsync();
}
public void LoadLibrary(string dllPath)
{
currentFlowEnvironment.LoadLibrary(dllPath);
}
/// <summary>
/// 保存项目
/// </summary>
public void SaveProject()
{
currentFlowEnvironment.SaveProject();
}
public void LoadProject(FlowEnvInfo flowEnvInfo, string filePath)
{
if (flowEnvInfo is null) return;
SetProjectLoadingFlag(false);
currentFlowEnvironment.LoadProject(flowEnvInfo, filePath);
SetProjectLoadingFlag(true);
}
public void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType)
{
currentFlowEnvironment.MonitorObjectNotification(nodeGuid, monitorData, sourceType);
}
public void MoveNode(string canvasGuid, string nodeGuid, double x, double y)
{
currentFlowEnvironment.MoveNode(canvasGuid, nodeGuid, x, y);
}
public void NodeLocated(string nodeGuid)
{
currentFlowEnvironment.NodeLocated(nodeGuid);
}
public bool TryUnloadLibrary(string assemblyName)
{
return currentFlowEnvironment.TryUnloadLibrary(assemblyName);
}
/// <summary>
/// 设置两个节点某个类型的方法调用关系为优先调用
/// </summary>
/// <param name="fromNodeGuid">起始节点</param>
/// <param name="toNodeGuid">目标节点</param>
/// <param name="connectionType">连接关系</param>
/// <returns>是否成功调用</returns>
public async Task<bool> SetConnectPriorityInvoke(string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType)
{
return await currentFlowEnvironment.SetConnectPriorityInvoke(fromNodeGuid, toNodeGuid, connectionType);
}
/// <summary>
/// 移除方法调用关系
/// </summary>
/// <param name="fromNodeGuid"></param>
/// <param name="toNodeGuid"></param>
/// <param name="connectionType"></param>
/// <returns></returns>
public async Task<bool> RemoveConnectInvokeAsync(string canvasGuid, string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType)
{
return await currentFlowEnvironment.RemoveConnectInvokeAsync(canvasGuid, fromNodeGuid, toNodeGuid, connectionType);
}
/// <summary>
/// 移除连接节点之间参数传递的关系
/// </summary>
/// <param name="fromNodeGuid">起始节点Guid</param>
/// <param name="toNodeGuid">目标节点Guid</param>
/// <param name="argIndex">连接到第几个参数</param>
/// <param name="connectionArgSourceType">参数来源类型</param>
public async Task<bool> RemoveConnectArgSourceAsync(string canvasGuid, string fromNodeGuid, string toNodeGuid, int argIndex)
{
return await currentFlowEnvironment.RemoveConnectArgSourceAsync(canvasGuid, fromNodeGuid, toNodeGuid, argIndex);
}
public async Task<bool> RemoveNodeAsync(string canvasGuid, string nodeGuid)
{
return await currentFlowEnvironment.RemoveNodeAsync(canvasGuid, nodeGuid);
}
//public void SetConsoleOut()
//{
// currentFlowEnvironment.SetConsoleOut();
//}
/// <summary>
/// 输出信息
/// </summary>
/// <param name="message">日志内容</param>
/// <param name="type">日志类别</param>
/// <param name="class">日志级别</param>
public void WriteLine(InfoType type, string message, InfoClass @class = InfoClass.Trivial)
{
currentFlowEnvironment.WriteLine(type, message, @class);
}
#region MyRegion
#if false
public async Task<bool> AddInterruptExpressionAsync(string key, string expression)
{
return await currentFlowEnvironment.AddInterruptExpressionAsync(key, expression);
}
public async Task<(bool, string[])> CheckObjMonitorStateAsync(string key)
{
return await currentFlowEnvironment.CheckObjMonitorStateAsync(key);
}
public async Task<ChannelFlowInterrupt.CancelType> GetOrCreateGlobalInterruptAsync()
{
return await currentFlowEnvironment.InterruptNode();
}
public void SetMonitorObjState(string key, bool isMonitor)
{
currentFlowEnvironment.SetMonitorObjState(key, isMonitor);
}
public async Task<bool> SetNodeInterruptAsync(string nodeGuid, bool isInterrupt)
{
return await currentFlowEnvironment.SetNodeInterruptAsync(nodeGuid, isInterrupt);
}
#endif
#endregion
public async Task<string> SetStartNodeAsync(string canvasGuid, string nodeGuid)
{
return await currentFlowEnvironment.SetStartNodeAsync(canvasGuid, nodeGuid);
}
public async Task<bool> StartFlowAsync(string[] canvasGuids)
{
return await currentFlowEnvironment.StartFlowAsync(canvasGuids);
}
public async Task<bool> StartFlowFromSelectNodeAsync(string startNodeGuid)
{
return await currentFlowEnvironment.StartFlowFromSelectNodeAsync(startNodeGuid);
}
public async Task StartRemoteServerAsync(int port = 7525)
{
await currentFlowEnvironment.StartRemoteServerAsync(port);
}
public void StopRemoteServer()
{
currentFlowEnvironment.StopRemoteServer();
}
public void TerminateFlipflopNode(string nodeGuid)
{
currentFlowEnvironment.TerminateFlipflopNode(nodeGuid);
}
public void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type)
{
currentFlowEnvironment.TriggerInterrupt(nodeGuid, expression, type);
}
/// <summary>
/// 设置在UI线程操作的线程上下文
/// </summary>
/// <param name="uiContextOperation"></param>
public void SetUIContextOperation(UIContextOperation uiContextOperation)
{
currentFlowEnvironment.SetUIContextOperation(uiContextOperation);
}
public bool TryGetNodeModel(string nodeGuid, out IFlowNode nodeModel)
{
return currentFlowEnvironment.TryGetNodeModel(nodeGuid, out nodeModel);
}
public bool TryGetDelegateDetails(string libraryName, string methodName, out DelegateDetails del)
{
return currentFlowEnvironment.TryGetDelegateDetails(libraryName, methodName, out del);
}
public bool TryGetMethodDetailsInfo(string libraryName, string methodName, out MethodDetailsInfo mdInfo)
{
return currentFlowEnvironment.TryGetMethodDetailsInfo(libraryName, methodName, out mdInfo);
}
//public void WriteLineObjToJson(object obj)
//{
// currentFlowEnvironment.WriteLineObjToJson(obj);
//}
/// <summary>
/// (用于远程)通知节点属性变更
/// </summary>
/// <param name="nodeGuid">节点Guid</param>
/// <param name="path">属性路径</param>
/// <param name="value">属性值</param>
/// <returns></returns>
public async Task NotificationNodeValueChangeAsync(string nodeGuid, string path, object value)
{
if (!IsLoadingProject())
{
return;
}
if (currentFlowEnvironment.IsControlRemoteEnv)
{
await currentFlowEnvironment.NotificationNodeValueChangeAsync(nodeGuid, path, value);
}
}
/// <summary>
/// 改变可选参数的数目
/// </summary>
/// <param name="nodeGuid">对应的节点Guid</param>
/// <param name="isAdd">true增加参数false减少参数</param>
/// <param name="paramIndex">以哪个参数为模板进行拷贝,或删去某个参数(该参数必须为可选参数)</param>
/// <returns></returns>
public async Task<bool> ChangeParameter(string nodeGuid, bool isAdd, int paramIndex)
{
return await currentFlowEnvironment.ChangeParameter(nodeGuid, isAdd, paramIndex);
}
#region
/// <summary>
/// 运行时加载
/// </summary>
/// <param name="file">文件名</param>
/// <returns></returns>
public bool LoadNativeLibraryOfRuning(string file)
{
return currentFlowEnvironment.LoadNativeLibraryOfRuning(file);
}
/// <summary>
/// 运行时加载指定目录下的类库
/// </summary>
/// <param name="path">目录</param>
/// <param name="isRecurrence">是否递归加载</param>
public void LoadAllNativeLibraryOfRuning(string path, bool isRecurrence = true)
{
currentFlowEnvironment.LoadAllNativeLibraryOfRuning(path,isRecurrence);
}
#endregion
#region IOC容器
public ISereinIOC Build()
{
return IOC.Build();
}
//public bool RegisterInstance(string key, object instance)
//{
// return IOC.RegisterInstance(key, instance);
//}
public object Get(Type type)
{
return IOC.Get(type);
}
public T Get<T>()
{
return IOC.Get<T>();
}
//public T Get<T>(string key)
//{
// return IOC.Get<T>(key);
//}
public object CreateTempObject(Type type)
{
return IOC.CreateTempObject(type);
}
public T CreateTempObject<T>()
{
return IOC.CreateTempObject<T>();
}
public ISereinIOC Register(Type type)
{
return IOC.Register(type);
}
public ISereinIOC Register(Type type, Func<object> getInstance)
{
return IOC.Register(type, getInstance);
}
public ISereinIOC Register<T>(Func<T> getInstance)
{
return IOC.Register<T>(getInstance);
}
public ISereinIOC Register<TService, TImplementation>(Func<TService> getInstance) where TImplementation : TService
{
return IOC.Register<TService, TImplementation>(getInstance);
}
public ISereinIOC Register<TService, TImplementation>() where TImplementation : TService
{
return IOC.Register<TService, TImplementation>();
}
public ISereinIOC Reset()
{
return IOC.Reset();
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -10,9 +10,9 @@ namespace Serein.NodeFlow.Env
/// 客户端的消息管理(用于处理服务端的响应)
/// </summary>
[AutoSocketModule(ThemeKey = FlowEnvironment.ThemeKey,
DataKey = FlowEnvironment.DataKey,
MsgIdKey = FlowEnvironment.MsgIdKey)]
[AutoSocketModule(ThemeKey = LocalFlowEnvironment.ThemeKey,
DataKey = LocalFlowEnvironment.DataKey,
MsgIdKey = LocalFlowEnvironment.MsgIdKey)]
public class MsgControllerOfClient : ISocketHandleModule
{
public Guid HandleGuid => new Guid();

View File

@@ -11,9 +11,9 @@ namespace Serein.NodeFlow.Env
/// <summary>
/// 服务端的消息管理(用于处理客户端的请求)
/// </summary>
[AutoSocketModule(ThemeKey = FlowEnvironment.ThemeKey,
DataKey = FlowEnvironment.DataKey,
MsgIdKey = FlowEnvironment.MsgIdKey)]
[AutoSocketModule(ThemeKey = LocalFlowEnvironment.ThemeKey,
DataKey = LocalFlowEnvironment.DataKey,
MsgIdKey = LocalFlowEnvironment.MsgIdKey)]
public class MsgControllerOfServer : ISocketHandleModule
{
/// <summary>
@@ -156,8 +156,8 @@ namespace Serein.NodeFlow.Env
{
JObject sendJson = new JObject
{
[FlowEnvironment.ThemeKey] = theme,
[FlowEnvironment.DataKey] = JObject.FromObject(data),
[LocalFlowEnvironment.ThemeKey] = theme,
[LocalFlowEnvironment.DataKey] = JObject.FromObject(data),
};
var msg = sendJson.ToString();
await SendAsync(msg);

View File

@@ -65,7 +65,7 @@ namespace Serein.NodeFlow.Env
public ISereinIOC IOC => throw new NotImplementedException();
public string EnvName => FlowEnvironment.SpaceName;
public string EnvName => LocalFlowEnvironment.SpaceName;
/// <summary>
/// 远程项目的网络位置WebSocket + IP + 端口 远程主机的文件路径)
@@ -1424,6 +1424,11 @@ namespace Serein.NodeFlow.Env
this.WriteLine(InfoType.INFO, "远程环境尚未实现的接口LoadAllNativeLibraryOfRuning");
}
public void UseExternalIOC(ISereinIOC ioc)
{
throw new NotImplementedException();
}
#endregion