It has been a long time (10 months) since I worked with the Ninject MessageBroker and a couple things have changed since my last post. In the old version you had to connect the MessageBroker as a kernel component by hand. Since then the extension environment has been flushed out a lot more. Now you can register the MessageBrokerModule when constructing your kernel object.
              | using System;using System.Diagnostics;
 using System.Net;
 using System.Text.RegularExpressions;
 using Ninject.Core;
 using Ninject.Extensions.MessageBroker;
 
 namespace NinjectMessageBroker
 {
 internal class Program
 {
 private static void Main()
 {
 // Intialize our injection kernel adding message broker functionality.
 using (var kernel = new StandardKernel(new[] { new MessageBrokerModule() }))
 {
 // Get the event publisher. It reads the current time and fires an event
 var pub = kernel.Get<TimeReader>();
 Debug.Assert(pub != null);
 
 // Get the subscriber, it waits to get the current time and writes it to stdout
 var sub = kernel.Get<TimeWriter>();
 Debug.Assert(sub != null);
 
 // Verify that they were wired together
 Debug.Assert(pub.HasListeners);
 Debug.Assert(sub.LastMessage == null);
 
 // Get the current time. It should automatically let the TimeWriter know
 // without either of them ever knowing of one another.
 pub.GetCurrentTime();
 
 // Wait to exit.
 Console.ReadLine();
 }
 }
 }
 
 internal class TimeWriter
 {
 public string LastMessage { get; set; }
 
 [Subscribe("message://Time/MessageReceived")]
 public void OnMessageReceived(object sender, EventArgs<string> args)
 {
 LastMessage = args.EventData;
 Console.WriteLine(LastMessage);
 }
 }
 
 internal class TimeReader
 {
 public bool HasListeners
 {
 get { return (MessageReceived != null); }
 }
 
 [Publish("message://Time/MessageReceived")]
 public event EventHandler<EventArgs<string>> MessageReceived;
 
 /// <summary>
 /// Gets the current time and updates all subscribers.
 /// </summary>
 public virtual void GetCurrentTime()
 {
 string text = GetWebPage();
 var regex = new Regex(@"\d\d:\d\d:\d\d");
 MatchCollection matches = regex.Matches(text);
 string time = ((matches.Count == 2) ? matches[1] : matches[0]).Value;
 SendMessage(time);
 }
 
 /// <summary>
 /// Gets the contents of a web page as a string.
 /// </summary>
 /// <returns></returns>
 private static string GetWebPage()
 {
 const string url = "http://www.time.gov/timezone.cgi?Eastern/d/-5";
 var webClient = new WebClient();
 return webClient.DownloadString(url);
 }
 
 /// <summary>
 /// Sends the message to all subscribers in a threadsafe manner.
 /// </summary>
 /// <param name="message">The message.</param>
 public void SendMessage(string message)
 {
 EventHandler<EventArgs<string>> messageReceived = MessageReceived;
 
 if (messageReceived != null)
 {
 messageReceived(this, new EventArgs<string>(message));
 }
 }
 }
 
 public class EventArgs<TData> : EventArgs
 {
 public new static readonly EventArgs<TData> Empty;
 
 static EventArgs()
 {
 Empty = new EventArgs<TData>();
 }
 
 private EventArgs()
 {
 }
 
 public EventArgs(TData eventData)
 {
 EventData = eventData;
 }
 
 public TData EventData { get; private set; }
 }
 }
 
 | 
    
  
  
 
No comments:
Post a Comment