ntminer 6 years ago
parent
commit
a7817c426b

+ 5 - 3
src/NTMinerBus/Bus/MessageDispatcher.cs

@@ -26,7 +26,6 @@
                 throw new ArgumentNullException(nameof(message));
             }
             var messageType = typeof(TMessage);
-            MessageTypeAttribute messageTypeDescription = MessageTypeAttribute.GetMessageTypeAttribute(messageType);
             if (_handlers.ContainsKey(messageType)) {
                 var messageHandlers = _handlers[messageType].ToArray();
                 foreach (var messageHandler in messageHandlers) {
@@ -50,8 +49,11 @@
                     tMessageHandler.Run(message);
                 }
             }
-            else if (!messageTypeDescription.IsCanNoHandler) {
-                Write.DevWarn(messageType.FullName + "类型的消息没有对应的处理器");
+            else {
+                MessageTypeAttribute messageTypeAttr = MessageTypeAttribute.GetMessageTypeAttribute(messageType);
+                if (!messageTypeAttr.IsCanNoHandler) {
+                    Write.DevWarn(messageType.FullName + "类型的消息没有对应的处理器");
+                }
             }
         }
 

+ 14 - 0
src/NTMinerDataObjects/MinerClient/LocalMessageData.cs

@@ -4,6 +4,20 @@ namespace NTMiner.MinerClient {
     public class LocalMessageData : ILocalMessage, IDbEntity<Guid> {
         public LocalMessageData() { }
 
+        public static LocalMessageData Create(ILocalMessage data) {
+            if (data is LocalMessageData r) {
+                return r;
+            }
+            return new LocalMessageData {
+                Id = data.Id,
+                Channel = data.Channel,
+                MessageType = data.MessageType,
+                Provider = data.Provider,
+                Content = data.Content,
+                Timestamp = data.Timestamp
+            };
+        }
+
         public Guid GetId() {
             return this.Id;
         }

+ 0 - 2
src/NTMinerlib/LocalMessage/ILocalMessageSet.cs

@@ -3,8 +3,6 @@ using System.Collections.Generic;
 
 namespace NTMiner.LocalMessage {
     public interface ILocalMessageSet : IEnumerable<ILocalMessage> {
-        int Count { get; }
-        void Add(string channel, string provider, string messageType, string content);
         void Clear();
     }
 }

+ 23 - 39
src/NTMinerlib/LocalMessage/LocalMessageSet.cs

@@ -1,6 +1,5 @@
 using LiteDB;
 using NTMiner.MinerClient;
-using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -14,47 +13,32 @@ namespace NTMiner.LocalMessage {
             if (!string.IsNullOrEmpty(dbFileFullName)) {
                 _connectionString = $"filename={dbFileFullName};journal=false";
             }
-        }
-
-        public int Count {
-            get {
+            VirtualRoot.BuildCmdPath<AddLocalMessageCommand>(action: message => {
+                if (string.IsNullOrEmpty(_connectionString)) {
+                    return;
+                }
                 InitOnece();
-                return _records.Count;
-            }
-        }
-
-        public void Add(string channel, string provider, string messageType, string content) {
-            if (string.IsNullOrEmpty(_connectionString)) {
-                return;
-            }
-            InitOnece();
-            var data = new LocalMessageData {
-                Id = Guid.NewGuid(),
-                Channel = channel,
-                Provider = provider,
-                MessageType = messageType,
-                Content = content,
-                Timestamp = DateTime.Now
-            };
-            // TODO:批量持久化,异步持久化
-            List<ILocalMessage> removes = new List<ILocalMessage>();
-            lock (_locker) {
-                _records.AddFirst(data);
-                while (_records.Count > NTKeyword.LocalMessageSetCapacity) {
-                    var toRemove = _records.Last;
-                    removes.Add(toRemove.Value);
-                    _records.RemoveLast();
-                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                        var col = db.GetCollection<LocalMessageData>();
-                        col.Delete(toRemove.Value.Id);
+                var data = LocalMessageData.Create(message.Input);
+                // TODO:批量持久化,异步持久化
+                List<ILocalMessage> removes = new List<ILocalMessage>();
+                lock (_locker) {
+                    _records.AddFirst(data);
+                    while (_records.Count > NTKeyword.LocalMessageSetCapacity) {
+                        var toRemove = _records.Last;
+                        removes.Add(toRemove.Value);
+                        _records.RemoveLast();
+                        using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                            var col = db.GetCollection<LocalMessageData>();
+                            col.Delete(toRemove.Value.Id);
+                        }
                     }
                 }
-            }
-            using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                var col = db.GetCollection<LocalMessageData>();
-                col.Insert(data);
-            }
-            VirtualRoot.RaiseEvent(new LocalMessageAddedEvent(data, removes));
+                using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                    var col = db.GetCollection<LocalMessageData>();
+                    col.Insert(data);
+                }
+                VirtualRoot.RaiseEvent(new LocalMessageAddedEvent(data, removes));
+            });
         }
 
         public void Clear() {

+ 8 - 1
src/NTMinerlib/VirtualRoot.cs

@@ -358,7 +358,14 @@ namespace NTMiner {
                         break;
                 }
             }
-            LocalMessages.Add(LocalMessageChannel.This.GetName(), provider, messageType.GetName(), content);
+            Execute(new AddLocalMessageCommand(new LocalMessageData {
+                Id = Guid.NewGuid(),
+                Channel = LocalMessageChannel.This.GetName(),
+                Provider = provider,
+                MessageType = messageType.GetName(),
+                Content = content,
+                Timestamp = DateTime.Now
+            }));
         }
         #endregion
 

+ 2 - 1
src/UnitTests/LocalMessageTests.cs

@@ -1,5 +1,6 @@
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using NTMiner;
+using System.Linq;
 
 namespace UnitTests {
     [TestClass]
@@ -13,7 +14,7 @@ namespace UnitTests {
             for (int i = 0; i < times; i++) {
                 VirtualRoot.ThisLocalInfo(nameof(LocalMessageTests), content);
             }
-            Assert.IsTrue(VirtualRoot.LocalMessages.Count == NTKeyword.LocalMessageSetCapacity);
+            Assert.IsTrue(VirtualRoot.LocalMessages.Count() == NTKeyword.LocalMessageSetCapacity);
         }
     }
 }