سؤال

أنا تريد أن تجعل من حدث بسيط جدا الحافلة التي سوف تسمح لأي عميل الاشتراك في نوع معين من الحدث عند أي الناشر يدفع حدث في الحافلة باستخدام EventBus.PushEvent() الطريقة الوحيدة العملاء التي اشتركت في ذلك نوع الحدث سوف تحصل على الحدث.

أنا باستخدام C#.NET 2.0.

هل كانت مفيدة؟

المحلول 4

ولقد وجدت <م> عام الحافلات رسالة . ومن فئة واحدة بسيطة.

نصائح أخرى

صغيرة رسول هو خيار جيد, لقد تم استخدامه في حي مشروع 2.5 سنوات حتى الآن.بعض أمثلة التعليمات البرمجية من ويكي (الرابط أدناه):

النشر

messageHub.Publish(new MyMessage());

الاشتراك

messageHub.Subscribe<MyMessage>((m) => { MessageBox.Show("Message Received!"); });
messageHub.Subscribe<MyMessageAgain>((m) => { MessageBox.Show("Message Received!"); }, (m) => m.Content == "Testing");

الرمز على جيثب: https://github.com/grumpydev/TinyMessenger

ويكي هو هنا: https://github.com/grumpydev/TinyMessenger/wiki

أنه يحتوي على مجموعة Nuget أيضا

Install-Package TinyMessenger

وآخر واحد، مستوحاة من EventBus لالروبوت، ولكن أبسط من ذلك بكثير:

public class EventBus
{
    public static EventBus Instance { get { return instance ?? (instance = new EventBus()); } }

    public void Register(object listener)
    {
        if (!listeners.Any(l => l.Listener == listener))
            listeners.Add(new EventListenerWrapper(listener));
    }

    public void Unregister(object listener)
    {
        listeners.RemoveAll(l => l.Listener == listener);
    }

    public void PostEvent(object e)
    {
        listeners.Where(l => l.EventType == e.GetType()).ToList().ForEach(l => l.PostEvent(e));
    }

    private static EventBus instance;

    private EventBus() { }

    private List<EventListenerWrapper> listeners = new List<EventListenerWrapper>();

    private class EventListenerWrapper
    {
        public object Listener { get; private set; }
        public Type EventType { get; private set; }

        private MethodBase method;

        public EventListenerWrapper(object listener)
        {
            Listener = listener;

            Type type = listener.GetType();

            method = type.GetMethod("OnEvent");
            if (method == null)
                throw new ArgumentException("Class " + type.Name + " does not containt method OnEvent");

            ParameterInfo[] parameters = method.GetParameters();
            if (parameters.Length != 1)
                throw new ArgumentException("Method OnEvent of class " + type.Name + " have invalid number of parameters (should be one)");

            EventType = parameters[0].ParameterType;
        }

        public void PostEvent(object e)
        {
            method.Invoke(Listener, new[] { e });
        }
    }      
}

واستخدام القضية:

public class OnProgressChangedEvent
{

    public int Progress { get; private set; }

    public OnProgressChangedEvent(int progress)
    {
        Progress = progress;
    }
}

public class SomeForm : Form
{
    // ...

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        EventBus.Instance.Register(this);
    }

    public void OnEvent(OnProgressChangedEvent e)
    {
        progressBar.Value = e.Progress;
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        EventBus.Instance.Unregister(this);
    }
}

public class SomeWorkerSomewhere
{
    void OnDoWork()
    {
        // ...

        EventBus.Instance.PostEvent(new OnProgressChangedEvent(progress));

        // ...
    }
}

هل يمكن أيضا إجراء فحص التمديدات الوحدة: http://msdn.microsoft.com/en-us/library/cc440958. ASPX

[Publishes("TimerTick")]
public event EventHandler Expired;
private void OnTick(Object sender, EventArgs e)
{
  timer.Stop();
  OnExpired(this);
}

[SubscribesTo("TimerTick")]
public void OnTimerExpired(Object sender, EventArgs e)
{
  EventHandler handlers = ChangeLight;
  if(handlers != null)
  {
    handlers(this, EventArgs.Empty);
  }
  currentLight = ( currentLight + 1 ) % 3;
  timer.Duration = lightTimes[currentLight];
  timer.Start();
}

هل هناك أفضل منها؟

مركب كتلة تطبيق يتضمن سيط الحدث الذي قد يكون من استخدامها للك.

ويمكن الاطلاع على التنفيذ الجيد آخر على العنوان التالي:

http://code.google كوم / ع / كسر / المصدر / استعراض / جذع / تربيع / UTIL / EventBus.cs

وحالات الاستخدام يمكن الوصول إليها على العنوان التالي: /trunk/Squared/Util/UtilTests/Tests/EventTests.cs

وهذا التطبيق لا يحتاج مكتبة خارجية.

قد يكون هناك تحسين لتكون قادرة على الاشتراك مع نوع وليس سلسلة.

ويجب أن تحقق من الحلقة 3 في السبات رينوس أو شاشة Ayende ليلقي سلسلة - "تنفيذ وسيط الحدث ".

وهذا يظهر كيف يمكن تنفيذ وسيط الحدث بسيط جدا باستخدام وندسور لسلك الامور. وشفرة المصدر وشملت كذلك.

والحل وسيط الحدث المقترح هو بسيط جدا، لكنها لن تأخذ الكثير من ساعات لزيادة الحل للسماح الحجج لتمريرها جنبا إلى جنب مع الأحداث.

وأنا خلقت هذا:

https://github.com/RemiBou/RemiDDD/tree/ السيد / RemiDDD.Framework / Cqrs

وهناك التبعية مع ninject. كنت حصلت على MessageProcessor. إذا كنت ترغب في obsere حدث، وتنفيذ "IObserver" إذا كنت ترغب في التعامل مع أمر تنفيذ "ICommandHandleer"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top