00001 namespace Grendel.Communication { 00002 using System; 00003 using System.Collections.Generic; 00004 00008 public interface IMessageReceiver { 00009 void MessageReceiving(object message); 00010 } 00011 00018 public interface ICommunicator { 00022 int SendMessage(string targetGroup, object message); 00031 void Subscribe(string targetGroup, IMessageReceiver receiver); 00035 void SignOff(string targetGroup, IMessageReceiver receiver); 00041 string UniqueGroupIdentifier {get;} 00042 } 00043 00048 public class LocalCommunicator : ICommunicator { 00049 private int uid = 0; 00050 private Dictionary<string, List<IMessageReceiver>> mapping = 00051 new Dictionary<string,List<IMessageReceiver>>(); 00052 private static ICommunicator nexus = null; 00053 00054 00055 public int SendMessage (string targetGroup, object message) { 00056 int count = 0; 00057 if (mapping.ContainsKey(targetGroup)) 00058 foreach(IMessageReceiver receiver in mapping[targetGroup]) { 00059 receiver.MessageReceiving(message); 00060 count++; 00061 } 00062 return count; 00063 } 00064 00065 public void Subscribe (string targetGroup, IMessageReceiver receiver) { 00066 if (mapping.ContainsKey(targetGroup)) 00067 mapping[targetGroup] = new List<IMessageReceiver>(); 00068 mapping[targetGroup].Add(receiver); 00069 } 00070 00071 public void SignOff (string targetGroup, IMessageReceiver receiver) { 00072 if(mapping.ContainsKey(targetGroup)) { 00073 mapping[targetGroup].Remove(receiver); 00074 if(mapping[targetGroup].Count == 0) 00075 mapping.Remove(targetGroup); 00076 } 00077 } 00078 00079 public string UniqueGroupIdentifier { 00080 get { return "#" + uid++; } 00081 } 00082 00088 public static ICommunicator Nexus { 00089 get { 00090 if(nexus == null) 00091 nexus = new LocalCommunicator(); 00092 return nexus; 00093 } 00094 } 00095 00096 } 00097 00098 }