ntminer 5 سال پیش
والد
کامیت
4786a3e5f6
74فایلهای تغییر یافته به همراه270 افزوده شده و 261 حذف شده
  1. 2 2
      src/AppModels/AppContext.cs
  2. 1 1
      src/AppModels/AppContext.partials.CoinGroupViewModels.cs
  3. 2 2
      src/AppModels/AppContext.partials.CoinKernelViewModels.cs
  4. 1 1
      src/AppModels/AppContext.partials.CoinProfileViewModels.cs
  5. 2 2
      src/AppModels/AppContext.partials.CoinViewModels.cs
  6. 2 2
      src/AppModels/AppContext.partials.FileWriterViewModels.cs
  7. 2 2
      src/AppModels/AppContext.partials.FragmentWriterViewModels.cs
  8. 1 1
      src/AppModels/AppContext.partials.GpuProfileViewModels.cs
  9. 2 2
      src/AppModels/AppContext.partials.GroupViewModels.cs
  10. 2 2
      src/AppModels/AppContext.partials.KernelInputViewModels.cs
  11. 2 2
      src/AppModels/AppContext.partials.KernelOutputTranslaterViewModels.cs
  12. 2 2
      src/AppModels/AppContext.partials.KernelOutputViewModels.cs
  13. 2 2
      src/AppModels/AppContext.partials.KernelViewModels.cs
  14. 2 2
      src/AppModels/AppContext.partials.PackageViewModels.cs
  15. 1 1
      src/AppModels/AppContext.partials.PoolProfileViewModels.cs
  16. 2 2
      src/AppModels/AppContext.partials.PoolViewModels.cs
  17. 2 2
      src/AppModels/AppContext.partials.SysDicItemViewModels.cs
  18. 2 2
      src/AppModels/AppContext.partials.SysDicViewModels.cs
  19. 1 1
      src/AppModels/AppContext.partials.WalletViewModels.cs
  20. 1 1
      src/AppModels/Vms/KernelOutputKeywordsViewModel.cs
  21. 3 3
      src/AppModels/Vms/LocalMessagesViewModel.cs
  22. 2 2
      src/AppModels/Vms/MinerProfileViewModel.cs
  23. 3 3
      src/AppModels/Vms/ServerMessagesViewModel.cs
  24. 1 1
      src/AppModels/Vms/StartStopMineButtonViewModel.cs
  25. 61 61
      src/AppViews0/AppViewFactory.cs
  26. 1 1
      src/AppViews0/MainWindow.xaml.cs
  27. 1 1
      src/CalcConfigUpdater/Program.cs
  28. 14 14
      src/MinerClient/App.xaml.cs
  29. 4 4
      src/MinerStudio/App.xaml.cs
  30. 1 1
      src/NTMinerClient/Core/Cpus/Impl/CpuPackage.cs
  31. 3 3
      src/NTMinerClient/Core/Gpus/Impl/GpusSpeed.cs
  32. 1 1
      src/NTMinerClient/Core/Gpus/Impl/TempGruarder.cs
  33. 1 1
      src/NTMinerClient/Core/Impl/CalcConfigSet.cs
  34. 2 2
      src/NTMinerClient/Core/Impl/CoinGroupSet.cs
  35. 3 3
      src/NTMinerClient/Core/Impl/CoinSet.cs
  36. 3 3
      src/NTMinerClient/Core/Impl/FileWriterSet.cs
  37. 3 3
      src/NTMinerClient/Core/Impl/FragmentWriterSet.cs
  38. 3 3
      src/NTMinerClient/Core/Impl/GroupSet.cs
  39. 4 4
      src/NTMinerClient/Core/Impl/PoolSet.cs
  40. 4 4
      src/NTMinerClient/Core/Impl/ServerContext.cs
  41. 3 3
      src/NTMinerClient/Core/Impl/SysDicItemSet.cs
  42. 3 3
      src/NTMinerClient/Core/Impl/SysDicSet.cs
  43. 5 5
      src/NTMinerClient/Core/Kernels/Impl/CoinKernelSet.cs
  44. 3 3
      src/NTMinerClient/Core/Kernels/Impl/KernelInputSet.cs
  45. 3 3
      src/NTMinerClient/Core/Kernels/Impl/KernelOutputSet.cs
  46. 3 3
      src/NTMinerClient/Core/Kernels/Impl/KernelOutputTranslaterSet.cs
  47. 3 3
      src/NTMinerClient/Core/Kernels/Impl/KernelSet.cs
  48. 3 3
      src/NTMinerClient/Core/Kernels/Impl/PackageSet.cs
  49. 3 3
      src/NTMinerClient/Core/Kernels/Impl/PoolKernelSet.cs
  50. 3 3
      src/NTMinerClient/Core/MinerServer/Impl/ColumnsShowSet.cs
  51. 3 3
      src/NTMinerClient/Core/MinerServer/Impl/MineWorkSet.cs
  52. 3 3
      src/NTMinerClient/Core/MinerServer/Impl/MinerGroupSet.cs
  53. 3 3
      src/NTMinerClient/Core/MinerServer/Impl/NTMinerWalletSet.cs
  54. 3 3
      src/NTMinerClient/Core/MinerServer/Impl/OverClockDataSet.cs
  55. 2 2
      src/NTMinerClient/Core/MinerServer/Impl/ServerAppSettingSet.cs
  56. 3 3
      src/NTMinerClient/Core/MinerServer/Impl/UserSet.cs
  57. 2 2
      src/NTMinerClient/Core/Profiles/Impl/GpuProfileSet.cs
  58. 3 3
      src/NTMinerClient/Core/Profiles/Impl/WalletSet.cs
  59. 2 2
      src/NTMinerClient/IServerContext.cs
  60. 6 6
      src/NTMinerClient/NTMinerRoot.cs
  61. 3 3
      src/NTMinerClient/NTMinerRoot.partials.MinerProcess.cs
  62. 4 4
      src/NTMinerClient/Report.cs
  63. 1 1
      src/NTMinerDaemon/HostRoot.cs
  64. 1 1
      src/NTMinerHub/Hub/MessagePath`1.cs
  65. 3 3
      src/NTMinerRpcClient/KernelOutputKeyword/KernelOutputKeywordSet.cs
  66. 5 5
      src/NTMinerRpcClient/ServerMessage/ServerMessageSet.cs
  67. 1 1
      src/NTMinerServices/Data/Impl/ClientSet.cs
  68. 2 2
      src/NTMinerServices/Data/Impl/CoinSnapshotSet.cs
  69. 3 3
      src/NTMinerServices/Data/Impl/UserSet.cs
  70. 2 2
      src/NTMinerWpf/WindowExtension.cs
  71. 1 1
      src/NTMinerlib/AppSetting/LocalAppSettingSet.cs
  72. 2 2
      src/NTMinerlib/LocalMessage/LocalMessageSet.cs
  73. 1 1
      src/NTMinerlib/Net/LocalIpSet.cs
  74. 27 18
      src/NTMinerlib/VirtualRoot.partials.Bus.cs

+ 2 - 2
src/AppModels/AppContext.cs

@@ -26,14 +26,14 @@ namespace NTMiner {
         // 因为是上下文路径,无需返回路径标识
         public static void BuildCmdPath<TCmd>(string description, LogEnum logType, Action<TCmd> action)
             where TCmd : ICmd {
-            var messagePathId = VirtualRoot.BuildPath(description, logType, action);
+            var messagePathId = VirtualRoot.AddMessagePath(description, logType, action);
             _contextHandlers.Add(messagePathId);
         }
 
         // 因为是上下文路径,无需返回路径标识
         public static void BuildEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action)
             where TEvent : IEvent {
-            var messagePathId = VirtualRoot.BuildPath(description, logType, action);
+            var messagePathId = VirtualRoot.AddMessagePath(description, logType, action);
             _contextHandlers.Add(messagePathId);
         }
 

+ 1 - 1
src/AppModels/AppContext.partials.CoinGroupViewModels.cs

@@ -15,7 +15,7 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         _listByGroupId.Clear();

+ 2 - 2
src/AppModels/AppContext.partials.CoinKernelViewModels.cs

@@ -14,12 +14,12 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChanged(nameof(AllCoinKernels));
                     });

+ 1 - 1
src/AppModels/AppContext.partials.CoinProfileViewModels.cs

@@ -27,7 +27,7 @@ namespace NTMiner {
                             _coinProfileDicById[message.CoinId].OnPropertyChanged(message.PropertyName);
                         }
                     });
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _coinKernelProfileDicById.Clear();
                         _coinProfileDicById.Clear();

+ 2 - 2
src/AppModels/AppContext.partials.CoinViewModels.cs

@@ -19,12 +19,12 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         AllPropertyChanged();
                     });

+ 2 - 2
src/AppModels/AppContext.partials.FileWriterViewModels.cs

@@ -18,12 +18,12 @@ namespace NTMiner {
                 this.Add = new DelegateCommand(() => {
                     new FileWriterViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChangeds();
                     });

+ 2 - 2
src/AppModels/AppContext.partials.FragmentWriterViewModels.cs

@@ -18,12 +18,12 @@ namespace NTMiner {
                 this.Add = new DelegateCommand(() => {
                     new FragmentWriterViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChangeds();
                     });

+ 1 - 1
src/AppModels/AppContext.partials.GpuProfileViewModels.cs

@@ -17,7 +17,7 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<GpuProfileSetRefreshedEvent>("Gpu超频集合刷新后刷新附着在当前币种上的超频数据", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<GpuProfileSetRefreshedEvent>("Gpu超频集合刷新后刷新附着在当前币种上的超频数据", LogEnum.DevConsole,
                     action: message => {
                         lock (_locker) {
                             _listByCoinId.Clear();

+ 2 - 2
src/AppModels/AppContext.partials.GroupViewModels.cs

@@ -20,12 +20,12 @@ namespace NTMiner {
                         SortNumber = Count + 1
                     }.Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChangeds();
                     });

+ 2 - 2
src/AppModels/AppContext.partials.KernelInputViewModels.cs

@@ -14,12 +14,12 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChangeds();
                     });

+ 2 - 2
src/AppModels/AppContext.partials.KernelOutputTranslaterViewModels.cs

@@ -15,13 +15,13 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         _dicByKernelOutputId.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChanged(nameof(AllKernelOutputTranslaterVms));
                     });

+ 2 - 2
src/AppModels/AppContext.partials.KernelOutputViewModels.cs

@@ -14,12 +14,12 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         AllPropertyChanged();
                     });

+ 2 - 2
src/AppModels/AppContext.partials.KernelViewModels.cs

@@ -19,12 +19,12 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChanged(nameof(AllKernels));
                     });

+ 2 - 2
src/AppModels/AppContext.partials.PackageViewModels.cs

@@ -14,12 +14,12 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChanged(nameof(AllPackages));
                     });

+ 1 - 1
src/AppModels/AppContext.partials.PoolProfileViewModels.cs

@@ -19,7 +19,7 @@ namespace NTMiner {
                             vm.OnPropertyChanged(message.PropertyName);
                         }
                     });
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                     });

+ 2 - 2
src/AppModels/AppContext.partials.PoolViewModels.cs

@@ -13,12 +13,12 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChanged(nameof(AllPools));
                     });

+ 2 - 2
src/AppModels/AppContext.partials.SysDicItemViewModels.cs

@@ -14,12 +14,12 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChangeds();
                     });

+ 2 - 2
src/AppModels/AppContext.partials.SysDicViewModels.cs

@@ -17,13 +17,13 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
                     action: message => {
                         _dicByCode.Clear();
                         _dicById.Clear();
                         Init();
                     });
-                VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                     action: message => {
                         OnPropertyChangeds();
                     });

+ 1 - 1
src/AppModels/AppContext.partials.WalletViewModels.cs

@@ -13,7 +13,7 @@ namespace NTMiner {
 #if DEBUG
                 Write.Stopwatch.Start();
 #endif
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新钱包Vm内存", LogEnum.None,
+                VirtualRoot.AddEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新钱包Vm内存", LogEnum.None,
                     action: message=> {
                         _dicById.Clear();
                         Init();

+ 1 - 1
src/AppModels/Vms/KernelOutputKeywordsViewModel.cs

@@ -12,7 +12,7 @@ namespace NTMiner.Vms {
             if (WpfUtil.IsInDesignMode) {
                 return;
             }
-            VirtualRoot.BuildEventPath<CurrentMineContextChangedEvent>("挖矿上下文变更后刷新内核输出关键字Vm视图集", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<CurrentMineContextChangedEvent>("挖矿上下文变更后刷新内核输出关键字Vm视图集", LogEnum.DevConsole,
                 action: message => {
                     OnPropertyChanged(nameof(KernelOutputVm));
                 });

+ 3 - 3
src/AppModels/Vms/LocalMessagesViewModel.cs

@@ -70,13 +70,13 @@
                     VirtualRoot.Execute(new ClearLocalMessageSetCommand());
                 }));
             });
-            VirtualRoot.BuildEventPath<LocalMessageSetClearedEvent>("清空挖矿消息集后刷新VM内存", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<LocalMessageSetClearedEvent>("清空挖矿消息集后刷新VM内存", LogEnum.DevConsole,
                 action: message => {
                     UIThread.Execute(() => {
                         Init();
                     });
                 });
-            VirtualRoot.BuildEventPath<LocalMessageAddedEvent>("发生了挖矿事件后刷新Vm内存", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<LocalMessageAddedEvent>("发生了挖矿事件后刷新Vm内存", LogEnum.DevConsole,
                 action: message => {
                     UIThread.Execute(() => {
                         var vm = new LocalMessageViewModel(message.Target);
@@ -101,7 +101,7 @@
                         OnPropertyChanged(nameof(IsNoRecord));
                     });
                 });
-            VirtualRoot.BuildEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole,
                 action: message => {
                     if (QueryResults == null) {
                         return;

+ 2 - 2
src/AppModels/Vms/MinerProfileViewModel.cs

@@ -239,7 +239,7 @@ namespace NTMiner.Vms {
                     this.ArgsAssembly = string.Empty;
                 }
             });
-            VirtualRoot.BuildEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<ServerContextVmsReInitedEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
                 action: message => {
                     OnPropertyChanged(nameof(CoinVm));
                 });
@@ -256,7 +256,7 @@ namespace NTMiner.Vms {
                     OnPropertyChanged(message.PropertyName);
                 });
 
-            VirtualRoot.BuildEventPath<LocalContextVmsReInitedEvent>("本地上下文视图模型集刷新后刷新界面", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<LocalContextVmsReInitedEvent>("本地上下文视图模型集刷新后刷新界面", LogEnum.DevConsole,
                 action: message => {
                     AllPropertyChanged();
                     if (CoinVm != null) {

+ 3 - 3
src/AppModels/Vms/ServerMessagesViewModel.cs

@@ -42,13 +42,13 @@ namespace NTMiner.Vms {
                     VirtualRoot.Execute(new ClearServerMessages());
                 }));
             });
-            VirtualRoot.BuildEventPath<ServerMessagesClearedEvent>("清空了本地存储的服务器消息后刷新Vm内存", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<ServerMessagesClearedEvent>("清空了本地存储的服务器消息后刷新Vm内存", LogEnum.DevConsole,
                 action: message => {
                     UIThread.Execute(() => {
                         Init();
                     });
                 });
-            VirtualRoot.BuildEventPath<NewServerMessageLoadedEvent>("从服务器加载了新消息后刷新Vm内存", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<NewServerMessageLoadedEvent>("从服务器加载了新消息后刷新Vm内存", LogEnum.DevConsole,
                 action: message => {
                     UIThread.Execute(() => {
                         foreach (var item in message.Data) {
@@ -73,7 +73,7 @@ namespace NTMiner.Vms {
                         OnPropertyChanged(nameof(IsNoRecord));
                     });
                 });
-            VirtualRoot.BuildEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole,
                 action: message => {
                     if (QueryResults == null) {
                         return;

+ 1 - 1
src/AppModels/Vms/StartStopMineButtonViewModel.cs

@@ -46,7 +46,7 @@ namespace NTMiner.Vms {
             if (IsAutoStart && !this.MinerProfile.IsMining) {
                 this.MinerProfile.IsMining = true;
                 IMessagePathId handler = null;
-                handler = VirtualRoot.BuildViaLimitPath<Per1SecondEvent>("挖矿倒计时", LogEnum.None,
+                handler = VirtualRoot.AddViaLimitPath<Per1SecondEvent>("挖矿倒计时", LogEnum.None,
                 action: message => {
                     if (NTMinerRoot.IsAutoStartCanceled) {
                         BtnStopText = $"尚未开始";

+ 61 - 61
src/AppViews0/AppViewFactory.cs

@@ -12,306 +12,306 @@ namespace NTMiner.Views {
         }
 
         public override void Link() {
-            VirtualRoot.BuildCmdPath<ShowDialogWindowCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowDialogWindowCommand>(action: message => {
                 UIThread.Execute(() => {
                     DialogWindow.ShowSoftDialog(new DialogWindowViewModel(message: message.Message, title: message.Title, onYes: message.OnYes, icon: message.Icon));
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowQQGroupQrCodeCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowQQGroupQrCodeCommand>(action: message => {
                 UIThread.Execute(() => {
                     QQGroupQrCode.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowCalcCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowCalcCommand>(action: message => {
                 UIThread.Execute(() => {
                     Calc.ShowWindow(message.CoinVm);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowLocalIpsCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowLocalIpsCommand>(action: message => {
                 UIThread.Execute(() => {
                     LocalIpConfig.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowEthNoDevFeeCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowEthNoDevFeeCommand>(action: message => {
                 UIThread.Execute(() => {
                     EthNoDevFeeEdit.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowCalcConfigCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowCalcConfigCommand>(action: message => {
                 UIThread.Execute(() => {
                     CalcConfig.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowMinerClientsWindowCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowMinerClientsWindowCommand>(action: message => {
                 UIThread.Execute(() => {
                     MinerClientsWindow.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowNTMinerUpdaterConfigCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowNTMinerUpdaterConfigCommand>(action: message => {
                 UIThread.Execute(() => {
                     NTMinerUpdaterConfig.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowAboutPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowAboutPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     AboutPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowKernelOutputPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowKernelOutputPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelOutputPage.ShowWindow(message.SelectedKernelOutputVm);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowKernelInputPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowKernelInputPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelInputPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowTagBrandCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowTagBrandCommand>(action: message => {
                 if (NTMinerRoot.IsBrandSpecified) {
                     return;
                 }
                 BrandTag.ShowWindow();
             });
-            VirtualRoot.BuildCmdPath<ShowCoinPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowCoinPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     CoinPage.ShowWindow(message.CurrentCoin, message.TabType);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowGroupPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowGroupPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     GroupPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowSysDicPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowSysDicPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     SysDicPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowVirtualMemoryCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowVirtualMemoryCommand>(action: message => {
                 UIThread.Execute(() => {
                     VirtualMemory.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowRestartWindowsCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowRestartWindowsCommand>(action: message => {
                 UIThread.Execute(() => {
                     RestartWindows.ShowDialog();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowNotificationSampleCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowNotificationSampleCommand>(action: message => {
                 UIThread.Execute(() => {
                     NotificationSample.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowPropertyCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowPropertyCommand>(action: message => {
                 UIThread.Execute(() => {
                     Property.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowChartsWindowCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowChartsWindowCommand>(action: message => {
                 UIThread.Execute(() => {
                     ChartsWindow.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowOverClockDataPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowOverClockDataPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     OverClockDataPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowNTMinerWalletPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowNTMinerWalletPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     NTMinerWalletPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowMessagePathIdsCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowMessagePathIdsCommand>(action: message => {
                 UIThread.Execute(() => {
                     MessagePathIds.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowUserPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowUserPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     UserPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowRemoteDesktopLoginDialogCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowRemoteDesktopLoginDialogCommand>(action: message => {
                 RemoteDesktopLogin.ShowWindow(message.Vm);
             });
-            VirtualRoot.BuildCmdPath<ShowKernelsWindowCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowKernelsWindowCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelsWindow.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowKernelDownloaderCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowKernelDownloaderCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelDownloading.ShowWindow(message.KernelId, message.DownloadComplete);
                 });
             });
-            VirtualRoot.BuildCmdPath<EnvironmentVariableEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<EnvironmentVariableEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     EnvironmentVariableEdit.ShowWindow(message.CoinKernelVm, message.EnvironmentVariable);
                 });
             });
-            VirtualRoot.BuildCmdPath<InputSegmentEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<InputSegmentEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     InputSegmentEdit.ShowWindow(message.CoinKernelVm, message.Segment);
                 });
             });
-            VirtualRoot.BuildCmdPath<CoinKernelEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<CoinKernelEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     CoinKernelEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<CoinEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<CoinEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     CoinEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<ColumnsShowEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ColumnsShowEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     ColumnsShowEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowSpeedChartsCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowSpeedChartsCommand>(action: message => {
                 UIThread.Execute(() => {
                     SpeedCharts.ShowWindow(message.GpuSpeedVm);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowFileWriterPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowFileWriterPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     FileWriterPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<FileWriterEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<FileWriterEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     FileWriterEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowFragmentWriterPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowFragmentWriterPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     FragmentWriterPage.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<FragmentWriterEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<FragmentWriterEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     FragmentWriterEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<GroupEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<GroupEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     GroupEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<ServerMessageEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ServerMessageEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     ServerMessageEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<KernelInputEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<KernelInputEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelInputEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<KernelOutputKeywordEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<KernelOutputKeywordEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelOutputKeywordEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<KernelOutputTranslaterEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<KernelOutputTranslaterEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelOutputTranslaterEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<KernelOutputEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<KernelOutputEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelOutputEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowPackagesWindowCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowPackagesWindowCommand>(action: message => {
                 UIThread.Execute(() => {
                     PackagesWindow.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<KernelEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<KernelEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowMinerClientSettingCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowMinerClientSettingCommand>(action: message => {
                 UIThread.Execute(() => {
                     MinerClientSetting.ShowWindow(message.Vm);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowMinerNamesSeterCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowMinerNamesSeterCommand>(action: message => {
                 UIThread.Execute(() => {
                     MinerNamesSeter.ShowWindow(message.Vm);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowGpuProfilesPageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowGpuProfilesPageCommand>(action: message => {
                 UIThread.Execute(() => {
                     GpuProfilesPage.ShowWindow(message.MinerClientsWindowVm);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowMinerClientAddCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowMinerClientAddCommand>(action: message => {
                 UIThread.Execute(() => {
                     MinerClientAdd.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<MinerGroupEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<MinerGroupEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     MinerGroupEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<NTMinerWalletEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<NTMinerWalletEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     NTMinerWalletEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<MineWorkEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<MineWorkEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     MineWorkEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<OverClockDataEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<OverClockDataEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     OverClockDataEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<PackageEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<PackageEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     PackageEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<PoolKernelEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<PoolKernelEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     PoolKernelEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<PoolEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<PoolEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     PoolEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<SysDicItemEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<SysDicItemEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     SysDicItemEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<SysDicEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<SysDicEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     SysDicEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<ShowKernelOutputKeywordsCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowKernelOutputKeywordsCommand>(action: message => {
                 UIThread.Execute(() => {
                     KernelOutputKeywords.ShowWindow();
                 });
             });
-            VirtualRoot.BuildCmdPath<UserEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<UserEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     UserEdit.ShowWindow(message.FormType, message.Source);
                 });
             });
-            VirtualRoot.BuildCmdPath<WalletEditCommand>(action: message => {
+            VirtualRoot.AddCmdPath<WalletEditCommand>(action: message => {
                 UIThread.Execute(() => {
                     WalletEdit.ShowWindow(message.FormType, message.Source);
                 });

+ 1 - 1
src/AppViews0/MainWindow.xaml.cs

@@ -168,7 +168,7 @@ namespace NTMiner.Views {
             this.LocationChanged += (sender, e) => {
                 MoveConsoleWindow();
             };
-            VirtualRoot.BuildCmdPath<CloseMainWindowCommand>(action: message => {
+            VirtualRoot.AddCmdPath<CloseMainWindowCommand>(action: message => {
                 UIThread.Execute(() => {
                     this.Close();
                 });

+ 1 - 1
src/CalcConfigUpdater/Program.cs

@@ -16,7 +16,7 @@ namespace NTMiner {
                 // 将服务器地址设为localhost从而使用内网ip访问免于验证用户名密码
                 NTKeyword.SetOfficialServerHost("localhost");
                 NTMinerRegistry.SetAutoBoot("NTMiner.CalcConfigUpdater", true);
-                VirtualRoot.BuildEventPath<Per10MinuteEvent>("每10分钟更新收益计算器", LogEnum.DevConsole,
+                VirtualRoot.AddEventPath<Per10MinuteEvent>("每10分钟更新收益计算器", LogEnum.DevConsole,
                     action: message => {
                         UpdateAsync();
                     });

+ 14 - 14
src/MinerClient/App.xaml.cs

@@ -39,12 +39,12 @@ namespace NTMiner {
         protected override void OnStartup(StartupEventArgs e) {
             RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
             // 通过群控升级挖矿端的时候升级器可能不存在所以需要下载,下载的时候需要用到下载器所以下载器需要提前注册
-            VirtualRoot.BuildCmdPath<ShowFileDownloaderCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowFileDownloaderCommand>(action: message => {
                 UIThread.Execute(() => {
                     FileDownloader.ShowWindow(message.DownloadFileUrl, message.FileTitle, message.DownloadComplete);
                 });
             });
-            VirtualRoot.BuildCmdPath<UpgradeCommand>(action: message => {
+            VirtualRoot.AddCmdPath<UpgradeCommand>(action: message => {
                 AppStatic.Upgrade(message.FileName, message.Callback);
             });
             if (!string.IsNullOrEmpty(CommandLineArgs.Upgrade)) {
@@ -173,17 +173,17 @@ namespace NTMiner {
         }
 
         private void Link() {
-            VirtualRoot.BuildEventPath<StartingMineFailedEvent>("开始挖矿失败", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<StartingMineFailedEvent>("开始挖矿失败", LogEnum.DevConsole,
                 action: message => {
                     AppContext.Instance.MinerProfileVm.IsMining = false;
                     VirtualRoot.Out.ShowError(message.Message);
                 });
             #region 处理显示主界面命令
-            VirtualRoot.BuildCmdPath<ShowMainWindowCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowMainWindowCommand>(action: message => {
                 ShowMainWindow(message.IsToggle);
             });
             #endregion
-            VirtualRoot.BuildCmdPath<CloseNTMinerCommand>(action: message => {
+            VirtualRoot.AddCmdPath<CloseNTMinerCommand>(action: message => {
                 // 不能推迟这个日志记录的时机,因为推迟会有windows异常日志
                 VirtualRoot.ThisLocalWarn(nameof(NTMinerRoot), $"退出{VirtualRoot.AppName}。原因:{message.Reason}");
                 UIThread.Execute(() => {
@@ -197,13 +197,13 @@ namespace NTMiner {
                 });
             });
             #region 周期确保守护进程在运行
-            VirtualRoot.BuildEventPath<Per1MinuteEvent>("周期确保守护进程在运行", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<Per1MinuteEvent>("周期确保守护进程在运行", LogEnum.DevConsole,
                 action: message => {
                     Daemon.DaemonUtil.RunNTMinerDaemon();
                 });
             #endregion
             #region 开始和停止挖矿后
-            VirtualRoot.BuildEventPath<MineStartedEvent>("启动1080ti小药丸、启动DevConsole? 更新挖矿按钮状态", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MineStartedEvent>("启动1080ti小药丸、启动DevConsole? 更新挖矿按钮状态", LogEnum.DevConsole,
                 action: message => {
                     AppContext.Instance.MinerProfileVm.IsMining = true;
                     StartStopMineButtonViewModel.Instance.BtnStopText = "正在挖矿";
@@ -216,7 +216,7 @@ namespace NTMiner {
                     }
                     OhGodAnETHlargementPill.OhGodAnETHlargementPillUtil.Start();
                 });
-            VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后停止1080ti小药丸 挖矿停止后更新界面挖矿状态", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MineStopedEvent>("停止挖矿后停止1080ti小药丸 挖矿停止后更新界面挖矿状态", LogEnum.DevConsole,
                 action: message => {
                     AppContext.Instance.MinerProfileVm.IsMining = false;
                     StartStopMineButtonViewModel.Instance.BtnStopText = "尚未开始";
@@ -224,31 +224,31 @@ namespace NTMiner {
                 });
             #endregion
             #region 处理禁用win10系统更新
-            VirtualRoot.BuildCmdPath<BlockWAUCommand>(action: message => {
+            VirtualRoot.AddCmdPath<BlockWAUCommand>(action: message => {
                 NTMiner.Windows.WindowsUtil.BlockWAU();
             });
             #endregion
             #region 优化windows
-            VirtualRoot.BuildCmdPath<Win10OptimizeCommand>(action: message => {
+            VirtualRoot.AddCmdPath<Win10OptimizeCommand>(action: message => {
                 NTMiner.Windows.WindowsUtil.Win10Optimize();
             });
             #endregion
             #region 处理开启A卡计算模式
-            VirtualRoot.BuildCmdPath<SwitchRadeonGpuCommand>(action: message => {
+            VirtualRoot.AddCmdPath<SwitchRadeonGpuCommand>(action: message => {
                 if (NTMinerRoot.Instance.GpuSet.GpuType == GpuType.AMD) {
                     SwitchRadeonGpuMode(message.On);
                 }
             });
             #endregion
             #region 处理A卡驱动签名
-            VirtualRoot.BuildCmdPath<AtikmdagPatcherCommand>(action: message => {
+            VirtualRoot.AddCmdPath<AtikmdagPatcherCommand>(action: message => {
                 if (NTMinerRoot.Instance.GpuSet.GpuType == GpuType.AMD) {
                     AtikmdagPatcher.AtikmdagPatcherUtil.Run();
                 }
             });
             #endregion
             #region 启用或禁用windows远程桌面
-            VirtualRoot.BuildCmdPath<EnableWindowsRemoteDesktopCommand>(action: message => {
+            VirtualRoot.AddCmdPath<EnableWindowsRemoteDesktopCommand>(action: message => {
                 if (NTMinerRegistry.GetIsRemoteDesktopEnabled()) {
                     return;
                 }
@@ -263,7 +263,7 @@ namespace NTMiner {
             });
             #endregion
             #region 启用或禁用windows开机自动登录
-            VirtualRoot.BuildCmdPath<EnableOrDisableWindowsAutoLoginCommand>(action: message => {
+            VirtualRoot.AddCmdPath<EnableOrDisableWindowsAutoLoginCommand>(action: message => {
                 if (NTMiner.Windows.OS.Instance.IsAutoAdminLogon) {
                     return;
                 }

+ 4 - 4
src/MinerStudio/App.xaml.cs

@@ -40,12 +40,12 @@ namespace NTMiner {
 
         protected override void OnStartup(StartupEventArgs e) {
             RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
-            VirtualRoot.BuildCmdPath<ShowFileDownloaderCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ShowFileDownloaderCommand>(action: message => {
                 UIThread.Execute(() => {
                     FileDownloader.ShowWindow(message.DownloadFileUrl, message.FileTitle, message.DownloadComplete);
                 });
             });
-            VirtualRoot.BuildCmdPath<UpgradeCommand>(action: message => {
+            VirtualRoot.AddCmdPath<UpgradeCommand>(action: message => {
                 AppStatic.Upgrade(message.FileName, message.Callback);
             });
             try {
@@ -69,7 +69,7 @@ namespace NTMiner {
                         Init();
                     }
                 });
-                VirtualRoot.BuildCmdPath<CloseNTMinerCommand>(action: message => {
+                VirtualRoot.AddCmdPath<CloseNTMinerCommand>(action: message => {
                     // 不能推迟这个日志记录的时机,因为推迟会有windows异常日志
                     VirtualRoot.ThisLocalWarn(nameof(NTMinerRoot), $"退出{VirtualRoot.AppName}。原因:{message.Reason}");
                     UIThread.Execute(() => {
@@ -107,7 +107,7 @@ namespace NTMiner {
                     AppContext.NotifyIcon = ExtendedNotifyIcon.Create("群控客户端", isMinerStudio: true);
                 });
                 #region 处理显示主界面命令
-                VirtualRoot.BuildCmdPath<ShowMainWindowCommand>(action: message => {
+                VirtualRoot.AddCmdPath<ShowMainWindowCommand>(action: message => {
                     VirtualRoot.Execute(new ShowMinerClientsWindowCommand());
                 });
                 #endregion

+ 1 - 1
src/NTMinerClient/Core/Cpus/Impl/CpuPackage.cs

@@ -12,7 +12,7 @@ namespace NTMiner.Core.Cpus.Impl {
         }
 
         public void Start() {
-            VirtualRoot.BuildEventPath<Per1SecondEvent>("周期更新CpuAll的状态", LogEnum.None,
+            VirtualRoot.AddEventPath<Per1SecondEvent>("周期更新CpuAll的状态", LogEnum.None,
                 action: message => {
                     if (_isFirst) {
                         _isFirst = false;

+ 3 - 3
src/NTMinerClient/Core/Gpus/Impl/GpusSpeed.cs

@@ -13,12 +13,12 @@ namespace NTMiner.Core.Gpus.Impl {
         private readonly INTMinerRoot _root;
         public GpusSpeed(INTMinerRoot root) {
             _root = root;
-            VirtualRoot.BuildEventPath<Per10MinuteEvent>("周期清除过期的历史算力", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<Per10MinuteEvent>("周期清除过期的历史算力", LogEnum.DevConsole,
                 action: message => {
                     ClearOutOfDateHistory();
                 });
 
-            VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后产生一次0算力", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MineStopedEvent>("停止挖矿后产生一次0算力", LogEnum.DevConsole,
                 action: message => {
                     var now = DateTime.Now;
                     foreach (var gpu in _root.GpuSet.AsEnumerable()) {
@@ -29,7 +29,7 @@ namespace NTMiner.Core.Gpus.Impl {
                     }
                 });
 
-            VirtualRoot.BuildEventPath<MineStartedEvent>("挖矿开始时产生一次0算力0份额", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MineStartedEvent>("挖矿开始时产生一次0算力0份额", LogEnum.DevConsole,
                 action: message => {
                     var now = DateTime.Now;
                     _root.CoinShareSet.UpdateShare(message.MineContext.MainCoin.GetId(), 0, 0, now);

+ 1 - 1
src/NTMinerClient/Core/Gpus/Impl/TempGruarder.cs

@@ -21,7 +21,7 @@ namespace NTMiner.Core.Gpus.Impl {
                 return;
             }
             _isInited = true;
-            VirtualRoot.BuildEventPath<GpuStateChangedEvent>("当显卡温度变更时守卫温度防线", LogEnum.None,
+            VirtualRoot.AddEventPath<GpuStateChangedEvent>("当显卡温度变更时守卫温度防线", LogEnum.None,
                 action: message => {
                     IGpu gpu = message.Target;
                     if (gpu.Index == NTMinerRoot.GpuAllId || root.MinerProfile.CoinId == Guid.Empty) {

+ 1 - 1
src/NTMinerClient/Core/Impl/CalcConfigSet.cs

@@ -10,7 +10,7 @@ namespace NTMiner.Core.Impl {
 
         public CalcConfigSet(INTMinerRoot root) {
             _root = root;
-            VirtualRoot.BuildEventPath<MainWindowShowedEvent>("主界面显示后刷新收益计算器", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MainWindowShowedEvent>("主界面显示后刷新收益计算器", LogEnum.DevConsole,
                 action: message => {
                     Init(forceRefresh: true);
                 });

+ 2 - 2
src/NTMinerClient/Core/Impl/CoinGroupSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.Impl {
         private readonly Dictionary<Guid, CoinGroupData> _dicById = new Dictionary<Guid, CoinGroupData>();
 
         public CoinGroupSet(IServerContext context) {
-            context.BuildCmdPath<AddCoinGroupCommand>("添加币组", LogEnum.DevConsole,
+            context.AddCmdPath<AddCoinGroupCommand>("添加币组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -26,7 +26,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new CoinGroupAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveCoinGroupCommand>("移除币组", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveCoinGroupCommand>("移除币组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Impl/CoinSet.cs

@@ -8,7 +8,7 @@ namespace NTMiner.Core.Impl {
         private readonly Dictionary<Guid, CoinData> _dicById = new Dictionary<Guid, CoinData>();
 
         public CoinSet(IServerContext context) {
-            context.BuildCmdPath<AddCoinCommand>("添加币种", LogEnum.DevConsole,
+            context.AddCmdPath<AddCoinCommand>("添加币种", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -31,7 +31,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new CoinAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateCoinCommand>("更新币种", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateCoinCommand>("更新币种", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -53,7 +53,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new CoinUpdatedEvent(message.Id, message.Input));
                 });
-            context.BuildCmdPath<RemoveCoinCommand>("移除币种", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveCoinCommand>("移除币种", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Impl/FileWriterSet.cs

@@ -6,7 +6,7 @@ namespace NTMiner.Core.Impl {
         private readonly Dictionary<Guid, FileWriterData> _dicById = new Dictionary<Guid, FileWriterData>();
 
         public FileWriterSet(IServerContext context) {
-            context.BuildCmdPath<AddFileWriterCommand>("添加文件书写器", LogEnum.DevConsole,
+            context.AddCmdPath<AddFileWriterCommand>("添加文件书写器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -25,7 +25,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new FileWriterAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateFileWriterCommand>("更新文件书写器", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateFileWriterCommand>("更新文件书写器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -47,7 +47,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new FileWriterUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveFileWriterCommand>("移除文件书写器", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveFileWriterCommand>("移除文件书写器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Impl/FragmentWriterSet.cs

@@ -6,7 +6,7 @@ namespace NTMiner.Core.Impl {
         private readonly Dictionary<Guid, FragmentWriterData> _dicById = new Dictionary<Guid, FragmentWriterData>();
 
         public FragmentWriterSet(IServerContext context) {
-            context.BuildCmdPath<AddFragmentWriterCommand>("添加命令行片段书写器", LogEnum.DevConsole,
+            context.AddCmdPath<AddFragmentWriterCommand>("添加命令行片段书写器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -25,7 +25,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new FragmentWriterAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateFragmentWriterCommand>("更新命令行片段书写器", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateFragmentWriterCommand>("更新命令行片段书写器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -47,7 +47,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new FragmentWriterUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveFragmentWriterCommand>("移除组", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveFragmentWriterCommand>("移除组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Impl/GroupSet.cs

@@ -6,7 +6,7 @@ namespace NTMiner.Core.Impl {
         private readonly Dictionary<Guid, GroupData> _dicById = new Dictionary<Guid, GroupData>();
 
         public GroupSet(IServerContext context) {
-            context.BuildCmdPath<AddGroupCommand>("添加组", LogEnum.DevConsole,
+            context.AddCmdPath<AddGroupCommand>("添加组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -25,7 +25,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new GroupAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateGroupCommand>("更新组", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateGroupCommand>("更新组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -47,7 +47,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new GroupUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveGroupCommand>("移除组", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveGroupCommand>("移除组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 4 - 4
src/NTMinerClient/Core/Impl/PoolSet.cs

@@ -13,7 +13,7 @@ namespace NTMiner.Core.Impl {
         private readonly Dictionary<Guid, PoolDelay> _poolDelayById = new Dictionary<Guid, PoolDelay>();
 
         public PoolSet(IServerContext context) {
-            context.BuildCmdPath<AddPoolCommand>("添加矿池", LogEnum.DevConsole,
+            context.AddCmdPath<AddPoolCommand>("添加矿池", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -55,7 +55,7 @@ namespace NTMiner.Core.Impl {
                         }
                     }
                 });
-            context.BuildCmdPath<UpdatePoolCommand>("更新矿池", LogEnum.DevConsole,
+            context.AddCmdPath<UpdatePoolCommand>("更新矿池", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -88,7 +88,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new PoolUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemovePoolCommand>("移除矿池", LogEnum.DevConsole,
+            context.AddCmdPath<RemovePoolCommand>("移除矿池", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {
@@ -113,7 +113,7 @@ namespace NTMiner.Core.Impl {
                         VirtualRoot.Execute(new RemovePoolKernelCommand(poolKernelId));
                     }
                 });
-            VirtualRoot.BuildEventPath<PoolDelayPickedEvent>("提取了矿池延时后记录进内存", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<PoolDelayPickedEvent>("提取了矿池延时后记录进内存", LogEnum.DevConsole,
                 action: message => {
                     if (message.IsDual) {
                         if (_poolDelayById.TryGetValue(message.PoolId, out PoolDelay poolDelay)) {

+ 4 - 4
src/NTMinerClient/Core/Impl/ServerContext.cs

@@ -37,18 +37,18 @@ namespace NTMiner.Core.Impl {
         /// <summary>
         /// 命令窗口。使用该方法的代码行应将前两个参数放在第一行以方便vs查找引用时展示出参数信息
         /// </summary>
-        public void BuildCmdPath<TCmd>(string description, LogEnum logType, Action<TCmd> action)
+        public void AddCmdPath<TCmd>(string description, LogEnum logType, Action<TCmd> action)
             where TCmd : ICmd {
-            var messagePathId = VirtualRoot.BuildPath(description, logType, action);
+            var messagePathId = VirtualRoot.AddMessagePath(description, logType, action);
             _serverContextHandlers.Add(messagePathId);
         }
 
         /// <summary>
         /// 事件响应
         /// </summary>
-        public void BuildEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action)
+        public void AddEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action)
             where TEvent : IEvent {
-            var messagePathId = VirtualRoot.BuildPath(description, logType, action);
+            var messagePathId = VirtualRoot.AddMessagePath(description, logType, action);
             _serverContextHandlers.Add(messagePathId);
         }
 

+ 3 - 3
src/NTMinerClient/Core/Impl/SysDicItemSet.cs

@@ -10,7 +10,7 @@ namespace NTMiner.Core.Impl {
 
         public SysDicItemSet(IServerContext context) {
             _context = context;
-            _context.BuildCmdPath<AddSysDicItemCommand>("添加系统字典项", LogEnum.DevConsole,
+            _context.AddCmdPath<AddSysDicItemCommand>("添加系统字典项", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -36,7 +36,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new SysDicItemAddedEvent(message.Id, entity));
                 });
-            _context.BuildCmdPath<UpdateSysDicItemCommand>("更新系统字典项", LogEnum.DevConsole,
+            _context.AddCmdPath<UpdateSysDicItemCommand>("更新系统字典项", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -64,7 +64,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new SysDicItemUpdatedEvent(message.Id, entity));
                 });
-            _context.BuildCmdPath<RemoveSysDicItemCommand>("移除系统字典项", LogEnum.DevConsole,
+            _context.AddCmdPath<RemoveSysDicItemCommand>("移除系统字典项", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Impl/SysDicSet.cs

@@ -8,7 +8,7 @@ namespace NTMiner.Core.Impl {
         private readonly Dictionary<Guid, SysDicData> _dicById = new Dictionary<Guid, SysDicData>();
 
         public SysDicSet(IServerContext context) {
-            context.BuildCmdPath<AddSysDicCommand>("添加系统字典", LogEnum.DevConsole,
+            context.AddCmdPath<AddSysDicCommand>("添加系统字典", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -31,7 +31,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new SysDicAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateSysDicCommand>("更新系统字典", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateSysDicCommand>("更新系统字典", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -53,7 +53,7 @@ namespace NTMiner.Core.Impl {
 
                     VirtualRoot.RaiseEvent(new SysDicUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveSysDicCommand>("移除系统字典", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveSysDicCommand>("移除系统字典", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 5 - 5
src/NTMinerClient/Core/Kernels/Impl/CoinKernelSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.Kernels.Impl {
         private readonly Dictionary<Guid, CoinKernelData> _dicById = new Dictionary<Guid, CoinKernelData>();
 
         public CoinKernelSet(IServerContext context) {
-            context.BuildCmdPath<AddCoinKernelCommand>("添加币种内核", LogEnum.DevConsole,
+            context.AddCmdPath<AddCoinKernelCommand>("添加币种内核", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -43,7 +43,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         }
                     }
                 });
-            context.BuildCmdPath<UpdateCoinKernelCommand>("更新币种内核", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateCoinKernelCommand>("更新币种内核", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -65,7 +65,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new CoinKernelUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveCoinKernelCommand>("移除币种内核", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveCoinKernelCommand>("移除币种内核", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {
@@ -93,7 +93,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         }
                     }
                 });
-            context.BuildEventPath<FileWriterRemovedEvent>("移除文件书写器后移除引用关系", LogEnum.DevConsole,
+            context.AddEventPath<FileWriterRemovedEvent>("移除文件书写器后移除引用关系", LogEnum.DevConsole,
                 action: message => {
                     var repository = NTMinerRoot.CreateServerRepository<CoinKernelData>();
                     var entities = _dicById.Values.Where(a => a.FileWriterIds.Contains(message.Target.GetId())).ToArray();
@@ -103,7 +103,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         VirtualRoot.RaiseEvent(new CoinKernelUpdatedEvent(message.Id, entity));
                     }
                 });
-            context.BuildEventPath<FragmentWriterRemovedEvent>("移除命令行片段书写器后移除引用关系", LogEnum.DevConsole,
+            context.AddEventPath<FragmentWriterRemovedEvent>("移除命令行片段书写器后移除引用关系", LogEnum.DevConsole,
                 action: message => {
                     var repository = NTMinerRoot.CreateServerRepository<CoinKernelData>();
                     var entities = _dicById.Values.Where(a => a.FragmentWriterIds.Contains(message.Target.GetId())).ToArray();

+ 3 - 3
src/NTMinerClient/Core/Kernels/Impl/KernelInputSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.Kernels.Impl {
         private readonly Dictionary<Guid, KernelInputData> _dicById = new Dictionary<Guid, KernelInputData>();
 
         public KernelInputSet(IServerContext context) {
-            context.BuildCmdPath<AddKernelInputCommand>("添加内核输入组", LogEnum.DevConsole,
+            context.AddCmdPath<AddKernelInputCommand>("添加内核输入组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -23,7 +23,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelInputAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateKernelInputCommand>("更新内核输入组", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateKernelInputCommand>("更新内核输入组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -45,7 +45,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelInputUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveKernelInputCommand>("移除内核输入组", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveKernelInputCommand>("移除内核输入组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Kernels/Impl/KernelOutputSet.cs

@@ -10,7 +10,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
         public KernelOutputSet(IServerContext context) {
             #region 接线
-            context.BuildCmdPath<AddKernelOutputCommand>("添加内核输出组", LogEnum.DevConsole,
+            context.AddCmdPath<AddKernelOutputCommand>("添加内核输出组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -26,7 +26,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelOutputAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateKernelOutputCommand>("更新内核输出组", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateKernelOutputCommand>("更新内核输出组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -48,7 +48,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelOutputUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveKernelOutputCommand>("移除内核输出组", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveKernelOutputCommand>("移除内核输出组", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Kernels/Impl/KernelOutputTranslaterSet.cs

@@ -17,7 +17,7 @@ namespace NTMiner.Core.Kernels.Impl {
         private readonly Dictionary<Guid, KernelOutputTranslaterData> _dicById = new Dictionary<Guid, KernelOutputTranslaterData>();
         private readonly Dictionary<Guid, List<KernelOutputTranslaterData>> _dicByKernelOutputId = new Dictionary<Guid, List<KernelOutputTranslaterData>>();
         public KernelOutputTranslaterSet(IServerContext context) {
-            context.BuildCmdPath<AddKernelOutputTranslaterCommand>("添加内核输出翻译器", LogEnum.DevConsole,
+            context.AddCmdPath<AddKernelOutputTranslaterCommand>("添加内核输出翻译器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -40,7 +40,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelOutputTranslaterAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateKernelOutputTranslaterCommand>("更新内核输出翻译器", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateKernelOutputTranslaterCommand>("更新内核输出翻译器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -64,7 +64,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelOutputTranslaterUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveKernelOutputTranslaterCommand>("移除内核输出翻译器", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveKernelOutputTranslaterCommand>("移除内核输出翻译器", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Kernels/Impl/KernelSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.Kernels.Impl {
         private readonly Dictionary<Guid, KernelData> _dicById = new Dictionary<Guid, KernelData>();
 
         public KernelSet(IServerContext context) {
-            context.BuildCmdPath<AddKernelCommand>("添加内核", LogEnum.DevConsole,
+            context.AddCmdPath<AddKernelCommand>("添加内核", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -26,7 +26,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdateKernelCommand>("更新内核", LogEnum.DevConsole,
+            context.AddCmdPath<UpdateKernelCommand>("更新内核", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -48,7 +48,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new KernelUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemoveKernelCommand>("移除内核", LogEnum.DevConsole,
+            context.AddCmdPath<RemoveKernelCommand>("移除内核", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Kernels/Impl/PackageSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.Kernels.Impl {
         private readonly Dictionary<Guid, PackageData> _dicById = new Dictionary<Guid, PackageData>();
 
         public PackageSet(IServerContext context) {
-            context.BuildCmdPath<AddPackageCommand>("添加包", LogEnum.DevConsole,
+            context.AddCmdPath<AddPackageCommand>("添加包", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -29,7 +29,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new PackageAddedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<UpdatePackageCommand>("更新包", LogEnum.DevConsole,
+            context.AddCmdPath<UpdatePackageCommand>("更新包", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -54,7 +54,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
                     VirtualRoot.RaiseEvent(new PackageUpdatedEvent(message.Id, entity));
                 });
-            context.BuildCmdPath<RemovePackageCommand>("移除包", LogEnum.DevConsole,
+            context.AddCmdPath<RemovePackageCommand>("移除包", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     if (message == null || message.EntityId == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/Kernels/Impl/PoolKernelSet.cs

@@ -9,7 +9,7 @@ namespace NTMiner.Core.Kernels.Impl {
 
         public PoolKernelSet(IServerContext context) {
             _context = context;
-            _context.BuildCmdPath<AddPoolKernelCommand>("处理添加矿池级内核命令", LogEnum.DevConsole,
+            _context.AddCmdPath<AddPoolKernelCommand>("处理添加矿池级内核命令", LogEnum.DevConsole,
                 action: message => {
                     if (!_dicById.ContainsKey(message.Input.GetId())) {
                         var entity = new PoolKernelData().Update(message.Input);
@@ -19,7 +19,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         VirtualRoot.RaiseEvent(new PoolKernelAddedEvent(message.Id, message.Input));
                     }
                 });
-            _context.BuildCmdPath<RemovePoolKernelCommand>("处理移除矿池级内核命令", LogEnum.DevConsole,
+            _context.AddCmdPath<RemovePoolKernelCommand>("处理移除矿池级内核命令", LogEnum.DevConsole,
                 action: message => {
                     if (_dicById.ContainsKey(message.EntityId)) {
                         var entity = _dicById[message.EntityId];
@@ -29,7 +29,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         VirtualRoot.RaiseEvent(new PoolKernelRemovedEvent(message.Id, entity));
                     }
                 });
-            _context.BuildCmdPath<UpdatePoolKernelCommand>("更新矿池内核", LogEnum.DevConsole,
+            _context.AddCmdPath<UpdatePoolKernelCommand>("更新矿池内核", LogEnum.DevConsole,
                 action: (message) => {
                     InitOnece();
                     if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {

+ 3 - 3
src/NTMinerClient/Core/MinerServer/Impl/ColumnsShowSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.MinerServer.Impl {
         private readonly Dictionary<Guid, ColumnsShowData> _dicById = new Dictionary<Guid, ColumnsShowData>();
 
         public ColumnsShowSet() {
-            VirtualRoot.BuildCmdPath<AddColumnsShowCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<AddColumnsShowCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty || message.Input.GetId() == ColumnsShowData.PleaseSelect.Id) {
                     throw new ArgumentNullException();
@@ -26,7 +26,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                     }
                 });
             });
-            VirtualRoot.BuildCmdPath<UpdateColumnsShowCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<UpdateColumnsShowCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -46,7 +46,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                 });
                 VirtualRoot.RaiseEvent(new ColumnsShowUpdatedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<RemoveColumnsShowCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<RemoveColumnsShowCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.EntityId == Guid.Empty || message.EntityId == ColumnsShowData.PleaseSelect.Id) {
                     throw new ArgumentNullException();

+ 3 - 3
src/NTMinerClient/Core/MinerServer/Impl/MineWorkSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.MinerServer.Impl {
         private readonly Dictionary<Guid, MineWorkData> _dicById = new Dictionary<Guid, MineWorkData>();
 
         public MineWorkSet() {
-            VirtualRoot.BuildCmdPath<AddMineWorkCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<AddMineWorkCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -25,7 +25,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                     Write.UserFail(response?.Description);
                 }
             });
-            VirtualRoot.BuildCmdPath<UpdateMineWorkCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<UpdateMineWorkCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -45,7 +45,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                 });
                 VirtualRoot.RaiseEvent(new MineWorkUpdatedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<RemoveMineWorkCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<RemoveMineWorkCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();

+ 3 - 3
src/NTMinerClient/Core/MinerServer/Impl/MinerGroupSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.MinerServer.Impl {
         private readonly Dictionary<Guid, MinerGroupData> _dicById = new Dictionary<Guid, MinerGroupData>();
 
         public MinerGroupSet() {
-            VirtualRoot.BuildCmdPath<AddMinerGroupCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<AddMinerGroupCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -29,7 +29,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                     }
                 });
             });
-            VirtualRoot.BuildCmdPath<UpdateMinerGroupCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<UpdateMinerGroupCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -52,7 +52,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                 });
                 VirtualRoot.RaiseEvent(new MinerGroupUpdatedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<RemoveMinerGroupCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<RemoveMinerGroupCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();

+ 3 - 3
src/NTMinerClient/Core/MinerServer/Impl/NTMinerWalletSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.MinerServer.Impl {
         private readonly Dictionary<Guid, NTMinerWalletData> _dicById = new Dictionary<Guid, NTMinerWalletData>();
 
         public NTMinerWalletSet() {
-            VirtualRoot.BuildCmdPath<AddNTMinerWalletCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<AddNTMinerWalletCommand>(action: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -28,7 +28,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                     }
                 });
             });
-            VirtualRoot.BuildCmdPath<UpdateNTMinerWalletCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<UpdateNTMinerWalletCommand>(action: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -50,7 +50,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                 });
                 VirtualRoot.RaiseEvent(new NTMinerWalletUpdatedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<RemoveNTMinerWalletCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<RemoveNTMinerWalletCommand>(action: (message) => {
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();
                 }

+ 3 - 3
src/NTMinerClient/Core/MinerServer/Impl/OverClockDataSet.cs

@@ -10,7 +10,7 @@ namespace NTMiner.Core.MinerServer.Impl {
 
         public OverClockDataSet(INTMinerRoot root) {
             _root = root;
-            VirtualRoot.BuildCmdPath<AddOverClockDataCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<AddOverClockDataCommand>(action: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -31,7 +31,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                     }
                 });
             });
-            VirtualRoot.BuildCmdPath<UpdateOverClockDataCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<UpdateOverClockDataCommand>(action: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -53,7 +53,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                 });
                 VirtualRoot.RaiseEvent(new OverClockDataUpdatedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<RemoveOverClockDataCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<RemoveOverClockDataCommand>(action: (message) => {
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();
                 }

+ 2 - 2
src/NTMinerClient/Core/MinerServer/Impl/ServerAppSettingSet.cs

@@ -8,7 +8,7 @@ namespace NTMiner.Core.MinerServer.Impl {
     public class ServerAppSettingSet : IAppSettingSet {
         private readonly Dictionary<string, AppSettingData> _dicByKey = new Dictionary<string, AppSettingData>(StringComparer.OrdinalIgnoreCase);
         public ServerAppSettingSet() {
-            VirtualRoot.BuildCmdPath<SetServerAppSettingCommand>(action: message => {
+            VirtualRoot.AddCmdPath<SetServerAppSettingCommand>(action: message => {
                 if (message.AppSetting == null) {
                     return;
                 }
@@ -39,7 +39,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                 });
                 VirtualRoot.RaiseEvent(new ServerAppSettingSetedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<SetServerAppSettingsCommand>(action: message => {
+            VirtualRoot.AddCmdPath<SetServerAppSettingsCommand>(action: message => {
                 if (message.AppSettings == null) {
                     return;
                 }

+ 3 - 3
src/NTMinerClient/Core/MinerServer/Impl/UserSet.cs

@@ -9,7 +9,7 @@ namespace NTMiner.Core.MinerServer.Impl {
         private Dictionary<string, UserData> _dicByLoginName = new Dictionary<string, UserData>();
 
         public UserSet() {
-            VirtualRoot.BuildCmdPath<AddUserCommand>(action: message => {
+            VirtualRoot.AddCmdPath<AddUserCommand>(action: message => {
                 if (!_dicByLoginName.ContainsKey(message.User.LoginName)) {
                     Server.UserService.AddUserAsync(new UserData {
                         LoginName = message.User.LoginName,
@@ -28,7 +28,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                     });
                 }
             });
-            VirtualRoot.BuildCmdPath<UpdateUserCommand>(action: message => {
+            VirtualRoot.AddCmdPath<UpdateUserCommand>(action: message => {
                 if (_dicByLoginName.ContainsKey(message.User.LoginName)) {
                     UserData entity = _dicByLoginName[message.User.LoginName];
                     UserData oldValue = new UserData(entity);
@@ -48,7 +48,7 @@ namespace NTMiner.Core.MinerServer.Impl {
                     VirtualRoot.RaiseEvent(new UserUpdatedEvent(message.Id, entity));
                 }
             });
-            VirtualRoot.BuildCmdPath<RemoveUserCommand>(action: message => {
+            VirtualRoot.AddCmdPath<RemoveUserCommand>(action: message => {
                 if (_dicByLoginName.ContainsKey(message.LoginName)) {
                     UserData entity = _dicByLoginName[message.LoginName];
                     Server.UserService.RemoveUserAsync(message.LoginName, (response, exception) => {

+ 2 - 2
src/NTMinerClient/Core/Profiles/Impl/GpuProfileSet.cs

@@ -12,7 +12,7 @@ namespace NTMiner.Core.Profiles.Impl {
         private GpuProfilesJsonDb _data = new GpuProfilesJsonDb();
 
         public GpuProfileSet(INTMinerRoot root) {
-            VirtualRoot.BuildCmdPath<AddOrUpdateGpuProfileCommand>(action: message => {
+            VirtualRoot.AddCmdPath<AddOrUpdateGpuProfileCommand>(action: message => {
                 GpuProfileData data = _data.GpuProfiles.FirstOrDefault(a => a.CoinId == message.Input.CoinId && a.Index == message.Input.Index);
                 if (data != null) {
                     data.Update(message.Input);
@@ -25,7 +25,7 @@ namespace NTMiner.Core.Profiles.Impl {
                 }
                 VirtualRoot.RaiseEvent(new GpuProfileAddedOrUpdatedEvent(message.Id, data));
             });
-            VirtualRoot.BuildCmdPath<CoinOverClockCommand>(action: message => {
+            VirtualRoot.AddCmdPath<CoinOverClockCommand>(action: message => {
                 Task.Factory.StartNew(() => {
                     CoinOverClock(root, message.CoinId);
                     VirtualRoot.RaiseEvent(new CoinOverClockDoneEvent(bornPathId: message.Id));

+ 3 - 3
src/NTMinerClient/Core/Profiles/Impl/WalletSet.cs

@@ -8,7 +8,7 @@ namespace NTMiner.Core.Profiles.Impl {
 
         public WalletSet(INTMinerRoot root) {
             _root = root;
-            VirtualRoot.BuildCmdPath<AddWalletCommand>(action: message => {
+            VirtualRoot.AddCmdPath<AddWalletCommand>(action: message => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -28,7 +28,7 @@ namespace NTMiner.Core.Profiles.Impl {
 
                 VirtualRoot.RaiseEvent(new WalletAddedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<UpdateWalletCommand>(action: message => {
+            VirtualRoot.AddCmdPath<UpdateWalletCommand>(action: message => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -51,7 +51,7 @@ namespace NTMiner.Core.Profiles.Impl {
 
                 VirtualRoot.RaiseEvent(new WalletUpdatedEvent(message.Id, entity));
             });
-            VirtualRoot.BuildCmdPath<RemoveWalletCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<RemoveWalletCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();

+ 2 - 2
src/NTMinerClient/IServerContext.cs

@@ -6,8 +6,8 @@ using System;
 namespace NTMiner {
     public interface IServerContext {
         void ReInit();
-        void BuildCmdPath<TCmd>(string description, LogEnum logType, Action<TCmd> action) where TCmd : ICmd;
-        void BuildEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action) where TEvent : IEvent;
+        void AddCmdPath<TCmd>(string description, LogEnum logType, Action<TCmd> action) where TCmd : ICmd;
+        void AddEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action) where TEvent : IEvent;
         ICoinGroupSet CoinGroupSet { get; }
         ICoinSet CoinSet { get; }
         IFileWriterSet FileWriterSet { get; }

+ 6 - 6
src/NTMinerClient/NTMinerRoot.cs

@@ -84,7 +84,7 @@ namespace NTMiner {
                             DoInit(isWork, callback);
                         });
                         #region 发生了用户活动时检查serverJson是否有新版本
-                        VirtualRoot.BuildEventPath<UserActionEvent>("发生了用户活动时检查serverJson是否有新版本", LogEnum.DevConsole,
+                        VirtualRoot.AddEventPath<UserActionEvent>("发生了用户活动时检查serverJson是否有新版本", LogEnum.DevConsole,
                             action: message => {
                                 RefreshServerJsonFile();
                             });
@@ -216,7 +216,7 @@ namespace NTMiner {
         }
 
         private void Link() {
-            VirtualRoot.BuildCmdPath<RegCmdHereCommand>(action: message => {
+            VirtualRoot.AddCmdPath<RegCmdHereCommand>(action: message => {
                 try {
                     Windows.Cmd.RegCmdHere(); 
                     VirtualRoot.ThisLocalInfo(nameof(NTMinerRoot), "windows右键命令行添加成功", OutEnum.Success);
@@ -226,14 +226,14 @@ namespace NTMiner {
                     VirtualRoot.ThisLocalError(nameof(NTMinerRoot), "windows右键命令行添加失败", OutEnum.Warn);
                 }
             });
-            VirtualRoot.BuildEventPath<Per1MinuteEvent>("每1分钟阻止系统休眠", LogEnum.None,
+            VirtualRoot.AddEventPath<Per1MinuteEvent>("每1分钟阻止系统休眠", LogEnum.None,
                 action: message => {
                     Windows.Power.PreventSleep();
                 });
             #region 挖矿开始时将无份额内核重启份额计数置0
             int shareCount = 0;
             DateTime shareOn = DateTime.Now;
-            VirtualRoot.BuildEventPath<MineStartedEvent>("挖矿开始后将无份额内核重启份额计数置0", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MineStartedEvent>("挖矿开始后将无份额内核重启份额计数置0", LogEnum.DevConsole,
                 action: message => {
                     // 将无份额内核重启份额计数置0
                     shareCount = 0;
@@ -243,7 +243,7 @@ namespace NTMiner {
                 });
             #endregion
             #region 每20秒钟检查是否需要重启
-            VirtualRoot.BuildEventPath<Per20SecondEvent>("每20秒钟检查是否需要重启", LogEnum.None,
+            VirtualRoot.AddEventPath<Per20SecondEvent>("每20秒钟检查是否需要重启", LogEnum.None,
                 action: message => {
                     #region 重启电脑
                     try {
@@ -322,7 +322,7 @@ namespace NTMiner {
                     #endregion
                 });
             #endregion
-            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期刷新显卡状态", LogEnum.None,
+            VirtualRoot.AddEventPath<Per10SecondEvent>("周期刷新显卡状态", LogEnum.None,
                 action: message => {
                     // 因为遇到显卡系统状态变更时可能费时
                     Task.Factory.StartNew(() => {

+ 3 - 3
src/NTMinerClient/NTMinerRoot.partials.MinerProcess.cs

@@ -37,7 +37,7 @@ namespace NTMiner {
                             if (Instance.GpuProfileSet.IsOverClockEnabled(mineContext.MainCoin.GetId())) {
                                 Write.UserWarn("应用超频,如果CPU性能较差耗时可能超过1分钟,请耐心等待");
                                 var cmd = new CoinOverClockCommand(mineContext.MainCoin.GetId());
-                                VirtualRoot.BuildOnecePath<CoinOverClockDoneEvent>("超频完成后继续流程", LogEnum.DevConsole,
+                                VirtualRoot.AddOnecePath<CoinOverClockDoneEvent>("超频完成后继续流程", LogEnum.DevConsole,
                                     message => {
                                         if (mineContext == Instance.LockedMineContext) {
                                             ContinueCreateProcess(mineContext);
@@ -132,7 +132,7 @@ namespace NTMiner {
                     clear?.Invoke();
                 }
                 string processName = mineContext.Kernel.GetProcessName();
-                _kernelProcessDaemon = VirtualRoot.BuildEventPath<Per1MinuteEvent>("周期性检查挖矿内核是否消失,如果消失尝试重启", LogEnum.DevConsole,
+                _kernelProcessDaemon = VirtualRoot.AddEventPath<Per1MinuteEvent>("周期性检查挖矿内核是否消失,如果消失尝试重启", LogEnum.DevConsole,
                     action: message => {
                         if (mineContext == Instance.LockedMineContext) {
                             if (!string.IsNullOrEmpty(processName)) {
@@ -273,7 +273,7 @@ namespace NTMiner {
                             }
                             VirtualRoot.DeletePath(closeHandle);
                         });
-                        closeHandle = VirtualRoot.BuildOnecePath<MineStopedEvent>("挖矿停止后关闭非托管的日志句柄", LogEnum.DevConsole,
+                        closeHandle = VirtualRoot.AddOnecePath<MineStopedEvent>("挖矿停止后关闭非托管的日志句柄", LogEnum.DevConsole,
                             action: message => {
                                 // 挖矿停止后摘除挖矿内核进程守护器
                                 if (_kernelProcessDaemon != null) {

+ 4 - 4
src/NTMinerClient/Report.cs

@@ -9,23 +9,23 @@ using System.Linq;
 namespace NTMiner {
     public static class Report {
         public static void Init() {
-            VirtualRoot.BuildEventPath<HasBoot10SecondEvent>("登录服务器并报告一次0算力", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<HasBoot10SecondEvent>("登录服务器并报告一次0算力", LogEnum.DevConsole,
                 action: message => {
                     // 报告0算力从而告知服务器该客户端当前在线的币种
                     ReportSpeed();
                 });
 
-            VirtualRoot.BuildEventPath<Per2MinuteEvent>("每两分钟上报一次", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<Per2MinuteEvent>("每两分钟上报一次", LogEnum.DevConsole,
                 action: message => {
                     ReportSpeed();
                 });
 
-            VirtualRoot.BuildEventPath<MineStartedEvent>("开始挖矿后报告状态", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MineStartedEvent>("开始挖矿后报告状态", LogEnum.DevConsole,
                 action: message => {
                     ReportSpeed();
                 });
 
-            VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后报告状态", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<MineStopedEvent>("停止挖矿后报告状态", LogEnum.DevConsole,
                 action: message => {
                     Server.ReportService.ReportStateAsync(NTKeyword.OfficialServerHost, VirtualRoot.Id, isMining: false);
                 });

+ 1 - 1
src/NTMinerDaemon/HostRoot.cs

@@ -110,7 +110,7 @@ namespace NTMiner {
             try {
                 HttpServer.Start($"http://localhost:{NTKeyword.NTMinerDaemonPort.ToString()}");
                 Windows.ConsoleHandler.Register(Close);
-                VirtualRoot.BuildEventPath<Per10SecondEvent>("呼吸表示活着", LogEnum.None,
+                VirtualRoot.AddEventPath<Per10SecondEvent>("呼吸表示活着", LogEnum.None,
                     action: message => {
                         NTMinerRegistry.SetDaemonActiveOn(DateTime.Now);
                         NoDevFee.NoDevFeeUtil.StartAsync();

+ 1 - 1
src/NTMinerHub/Hub/MessagePath`1.cs

@@ -17,7 +17,7 @@ namespace NTMiner.Hub {
         public event PropertyChangedEventHandler PropertyChanged;
 #endif
 
-        public static MessagePath<TMessage> Build(IMessageHub dispatcher, Type location, string description, LogEnum logType, Action<TMessage> path, Guid pathId, int viaLimit = -1) {
+        public static MessagePath<TMessage> AddMessagePath(IMessageHub dispatcher, Type location, string description, LogEnum logType, Action<TMessage> path, Guid pathId, int viaLimit = -1) {
             if (path == null) {
                 throw new ArgumentNullException(nameof(path));
             }

+ 3 - 3
src/NTMinerRpcClient/KernelOutputKeyword/KernelOutputKeywordSet.cs

@@ -20,7 +20,7 @@ namespace NTMiner.KernelOutputKeyword {
             _connectionString = $"filename={dbFileFullName};journal=false";
             _isServer = isServer;
             if (!isServer) {
-                VirtualRoot.BuildCmdPath<LoadKernelOutputKeywordCommand>(action: message => {
+                VirtualRoot.AddCmdPath<LoadKernelOutputKeywordCommand>(action: message => {
                     DateTime localTimestamp = VirtualRoot.LocalKernelOutputKeywordSetTimestamp;
                     // 如果已知服务器端最新内核输出关键字时间戳不比本地已加载的最新内核输出关键字时间戳新就不用加载了
                     if (message.KnowKernelOutputKeywordTimestamp <= Timestamp.GetTimestamp(localTimestamp)) {
@@ -55,7 +55,7 @@ namespace NTMiner.KernelOutputKeyword {
                     });
                 });
             }
-            VirtualRoot.BuildCmdPath<AddOrUpdateKernelOutputKeywordCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<AddOrUpdateKernelOutputKeywordCommand>(action: (message) => {
                 InitOnece();
                 if (isServer || !DevMode.IsDevMode) {
                     DataLevel dataLevel = isServer ? DataLevel.Global : DataLevel.Profile;
@@ -96,7 +96,7 @@ namespace NTMiner.KernelOutputKeyword {
                     });
                 }
             });
-            VirtualRoot.BuildCmdPath<RemoveKernelOutputKeywordCommand>(action: (message) => {
+            VirtualRoot.AddCmdPath<RemoveKernelOutputKeywordCommand>(action: (message) => {
                 InitOnece();
                 if (isServer || !DevMode.IsDevMode) {
                     if (message == null || message.EntityId == Guid.Empty) {

+ 5 - 5
src/NTMinerRpcClient/ServerMessage/ServerMessageSet.cs

@@ -15,7 +15,7 @@ namespace NTMiner.ServerMessage {
             }
             _connectionString = $"filename={dbFileFullName};journal=false";
             if (!isServer) {
-                VirtualRoot.BuildCmdPath<LoadNewServerMessageCommand>(action: message => {
+                VirtualRoot.AddCmdPath<LoadNewServerMessageCommand>(action: message => {
                     if (!VirtualRoot.IsServerMessagesVisible) {
                         return;
                     }
@@ -30,11 +30,11 @@ namespace NTMiner.ServerMessage {
                         }
                     });
                 });
-                VirtualRoot.BuildCmdPath<ReceiveServerMessageCommand>(action: message => {
+                VirtualRoot.AddCmdPath<ReceiveServerMessageCommand>(action: message => {
                     ReceiveServerMessage(message.Data);
                 });
             }
-            VirtualRoot.BuildCmdPath<AddOrUpdateServerMessageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<AddOrUpdateServerMessageCommand>(action: message => {
                 InitOnece();
                 if (isServer) {
                     #region Server
@@ -87,7 +87,7 @@ namespace NTMiner.ServerMessage {
                     });
                 }
             });
-            VirtualRoot.BuildCmdPath<MarkDeleteServerMessageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<MarkDeleteServerMessageCommand>(action: message => {
                 InitOnece();
                 if (isServer) {
                     #region Server
@@ -118,7 +118,7 @@ namespace NTMiner.ServerMessage {
                     });
                 }
             });
-            VirtualRoot.BuildCmdPath<ClearServerMessages>(action: message => {
+            VirtualRoot.AddCmdPath<ClearServerMessages>(action: message => {
                 InitOnece();
                 // 服务端不应有清空消息的功能
                 if (isServer) {

+ 1 - 1
src/NTMinerServices/Data/Impl/ClientSet.cs

@@ -14,7 +14,7 @@ namespace NTMiner.Data.Impl {
         private DateTime _getSpeedOn = DateTime.Now;
         internal ClientSet() {
             GetSpeed();
-            VirtualRoot.BuildEventPath<Per20SecondEvent>("周期性将内存中3分钟内活跃的ClientData列表刷入磁盘", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<Per20SecondEvent>("周期性将内存中3分钟内活跃的ClientData列表刷入磁盘", LogEnum.DevConsole,
                 action: message => {
                     InitOnece();
                     List<MinerData> minerDatas = new List<MinerData>();

+ 2 - 2
src/NTMinerServices/Data/Impl/CoinSnapshotSet.cs

@@ -11,11 +11,11 @@ namespace NTMiner.Data.Impl {
         private readonly List<CoinSnapshotData> _dataList = new List<CoinSnapshotData>();
         internal CoinSnapshotSet(IHostRoot root) {
             _root = root;
-            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期性拍摄快照", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<Per10SecondEvent>("周期性拍摄快照", LogEnum.DevConsole,
                 action: message => {
                     Snapshot(message.BornOn);
                 });
-            VirtualRoot.BuildEventPath<Per2MinuteEvent>("周期性拍摄快照", LogEnum.DevConsole,
+            VirtualRoot.AddEventPath<Per2MinuteEvent>("周期性拍摄快照", LogEnum.DevConsole,
                 action: message => {
                     DateTime time = DateTime.Now.AddMinutes(-20);
                     List<CoinSnapshotData> toRemoves = _dataList.Where(a => a.Timestamp < time).ToList();

+ 3 - 3
src/NTMinerServices/Data/Impl/UserSet.cs

@@ -11,7 +11,7 @@ namespace NTMiner.Data.Impl {
         private readonly string _dbFileFullName;
         public UserSet(string dbFileFullName) {
             _dbFileFullName = dbFileFullName;
-            VirtualRoot.BuildCmdPath<AddUserCommand>(action: message => {
+            VirtualRoot.AddCmdPath<AddUserCommand>(action: message => {
                 if (!_dicByLoginName.ContainsKey(message.User.LoginName)) {
                     UserData entity = new UserData(message.User);
                     _dicByLoginName.Add(message.User.LoginName, entity);
@@ -22,7 +22,7 @@ namespace NTMiner.Data.Impl {
                     VirtualRoot.RaiseEvent(new UserAddedEvent(message.Id, entity));
                 }
             });
-            VirtualRoot.BuildCmdPath<UpdateUserCommand>(action: message => {
+            VirtualRoot.AddCmdPath<UpdateUserCommand>(action: message => {
                 if (_dicByLoginName.ContainsKey(message.User.LoginName)) {
                     UserData entity = _dicByLoginName[message.User.LoginName];
                     entity.Update(message.User);
@@ -33,7 +33,7 @@ namespace NTMiner.Data.Impl {
                     VirtualRoot.RaiseEvent(new UserUpdatedEvent(message.Id, entity));
                 }
             });
-            VirtualRoot.BuildCmdPath<RemoveUserCommand>(action: message => {
+            VirtualRoot.AddCmdPath<RemoveUserCommand>(action: message => {
                 if (_dicByLoginName.ContainsKey(message.LoginName)) {
                     UserData entity = _dicByLoginName[message.LoginName];
                     _dicByLoginName.Remove(entity.LoginName);

+ 2 - 2
src/NTMinerWpf/WindowExtension.cs

@@ -116,7 +116,7 @@ namespace NTMiner {
                 window.Resources.Add(messagePathIdsResourceKey, messagePathIds);
                 window.Closed += UiElement_Closed;
             }
-            var messagePathId = VirtualRoot.BuildPath(description, logType, action);
+            var messagePathId = VirtualRoot.AddMessagePath(description, logType, action);
             messagePathIds.Add(messagePathId);
         }
 
@@ -135,7 +135,7 @@ namespace NTMiner {
                 window.Resources.Add(messagePathIdsResourceKey, messagePathIds);
                 window.Closed += UiElement_Closed; ;
             }
-            var messagePathId = VirtualRoot.BuildPath(description, logType, action);
+            var messagePathId = VirtualRoot.AddMessagePath(description, logType, action);
             messagePathIds.Add(messagePathId);
         }
 

+ 1 - 1
src/NTMinerlib/AppSetting/LocalAppSettingSet.cs

@@ -10,7 +10,7 @@ namespace NTMiner.AppSetting {
 
         public LocalAppSettingSet(string dbFileFullName) {
             _dbFileFullName = dbFileFullName;
-            VirtualRoot.BuildCmdPath<SetLocalAppSettingCommand>(action: message => {
+            VirtualRoot.AddCmdPath<SetLocalAppSettingCommand>(action: message => {
                 if (message.AppSetting == null) {
                     return;
                 }

+ 2 - 2
src/NTMinerlib/LocalMessage/LocalMessageSet.cs

@@ -12,7 +12,7 @@ namespace NTMiner.LocalMessage {
             if (!string.IsNullOrEmpty(dbFileFullName)) {
                 _connectionString = $"filename={dbFileFullName};journal=false";
             }
-            VirtualRoot.BuildCmdPath<AddLocalMessageCommand>(action: message => {
+            VirtualRoot.AddCmdPath<AddLocalMessageCommand>(action: message => {
                 if (string.IsNullOrEmpty(_connectionString)) {
                     return;
                 }
@@ -38,7 +38,7 @@ namespace NTMiner.LocalMessage {
                 }
                 VirtualRoot.RaiseEvent(new LocalMessageAddedEvent(message.Id, data, removes));
             });
-            VirtualRoot.BuildCmdPath<ClearLocalMessageSetCommand>(action: message => {
+            VirtualRoot.AddCmdPath<ClearLocalMessageSetCommand>(action: message => {
                 if (string.IsNullOrEmpty(_connectionString)) {
                     return;
                 }

+ 1 - 1
src/NTMinerlib/Net/LocalIpSet.cs

@@ -137,7 +137,7 @@ namespace NTMiner.Net {
                     VirtualRoot.ThisLocalWarn(nameof(LocalIpSet), $"网络不可用", toConsole: true);
                 }
             };
-            VirtualRoot.BuildCmdPath<SetLocalIpCommand>(action: message => {
+            VirtualRoot.AddCmdPath<SetLocalIpCommand>(action: message => {
                 ManagementObject mo = null; 
                 using (ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration")) {
                     ManagementObjectCollection moc = mc.GetInstances();

+ 27 - 18
src/NTMinerlib/VirtualRoot.partials.Bus.cs

@@ -16,37 +16,46 @@ namespace NTMiner {
         }
 
         // 修建消息(命令或事件)的运动路径
-        public static IMessagePathId BuildPath<TMessage>(string description, LogEnum logType, Action<TMessage> action) {
-            StackTrace ss = new StackTrace(false);
-            // 0是CreatePath,1是CreateCmdPath或CreateEventPath,2是当地
-            Type location = ss.GetFrame(2).GetMethod().DeclaringType;
-            return MessagePath<TMessage>.Build(MessageHub, location, description, logType, action, Guid.Empty);
+        public static IMessagePathId AddMessagePath<TMessage>(string description, LogEnum logType, Action<TMessage> action) {
+            Type location = GetMessagePathLocation();
+            return MessagePath<TMessage>.AddMessagePath(MessageHub, location, description, logType, action, Guid.Empty);
         }
 
-        public static IMessagePathId BuildOnecePath<TMessage>(string description, LogEnum logType, Action<TMessage> action, Guid pathId) {
-            StackTrace ss = new StackTrace(false);
-            // 0是CreatePath,1是CreateCmdPath或CreateEventPath,2是当地
-            Type location = ss.GetFrame(2).GetMethod().DeclaringType;
-            return MessagePath<TMessage>.Build(MessageHub, location, description, logType, action, pathId, viaLimit: 1);
+        public static IMessagePathId AddOnecePath<TMessage>(string description, LogEnum logType, Action<TMessage> action, Guid pathId) {
+            Type location = GetMessagePathLocation();
+            return MessagePath<TMessage>.AddMessagePath(MessageHub, location, description, logType, action, pathId, viaLimit: 1);
+        }
+
+        public static IMessagePathId AddViaLimitPath<TMessage>(string description, LogEnum logType, Action<TMessage> action, int viaLimit) {
+            Type location = GetMessagePathLocation();
+            return MessagePath<TMessage>.AddMessagePath(MessageHub, location, description, logType, action, Guid.Empty, viaLimit);
         }
 
-        public static IMessagePathId BuildViaLimitPath<TMessage>(string description, LogEnum logType, Action<TMessage> action, int viaLimit) {
+        private static Type GetMessagePathLocation() {
             StackTrace ss = new StackTrace(false);
-            // 0是CreatePath,1是CreateCmdPath或CreateEventPath,2是当地
-            Type location = ss.GetFrame(2).GetMethod().DeclaringType;
-            return MessagePath<TMessage>.Build(MessageHub, location, description, logType, action, Guid.Empty, viaLimit);
+            int index = 2;
+            Type location = ss.GetFrame(index).GetMethod().DeclaringType;
+            Type rootType = typeof(VirtualRoot);
+            while (location == rootType) {
+                index++;
+                if (index > 10) {
+                    throw new InvalidProgramException("不可能这么深");
+                }
+                location = ss.GetFrame(index).GetMethod().DeclaringType;
+            }
+            return location;
         }
 
-        public static void BuildCmdPath<TCmd>(Action<TCmd> action, LogEnum logType = LogEnum.DevConsole)
+        public static void AddCmdPath<TCmd>(Action<TCmd> action, LogEnum logType = LogEnum.DevConsole)
             where TCmd : ICmd {
             MessageTypeAttribute messageTypeDescription = MessageTypeAttribute.GetMessageTypeAttribute(typeof(TCmd));
             string description = "处理" + messageTypeDescription.Description;
-            BuildPath(description, logType, action);
+            AddMessagePath(description, logType, action);
         }
 
-        public static IMessagePathId BuildEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action)
+        public static IMessagePathId AddEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action)
             where TEvent : IEvent {
-            return BuildPath(description, logType, action);
+            return AddMessagePath(description, logType, action);
         }
 
         public static void DeletePath(IMessagePathId handler) {