Exemple #1
0
        public void DoesNotIntroduceGhostMethodsThroughRegistrationAndHandlingEvents()
        {
            this.testee = new EventBroker();

            ITestPublisher  testPublisher  = new MyPublisher();
            ITestSubscriber testSubscriber = new MySubscriber();

            int initialMethodCount = testSubscriber.GetType().GetMethods().GetLength(0);

            this.testee.Register(testPublisher);

            int methodCountAfterRegisteringPublisher = testSubscriber.GetType().GetMethods().GetLength(0);

            this.testee.Register(testSubscriber);

            int methodCountAfterRegisteringSubscriber = testSubscriber.GetType().GetMethods().GetLength(0);

            testPublisher.FireEvent();

            int methodCountAfterFiringEvent = testSubscriber.GetType().GetMethods().GetLength(0);

            methodCountAfterRegisteringPublisher.Should().Be(initialMethodCount, "registration of publisher should not introduce ghost methods");
            methodCountAfterRegisteringSubscriber.Should().Be(initialMethodCount, "registration of subscriber should not introduce ghost methods");
            methodCountAfterFiringEvent.Should().Be(initialMethodCount, "calling handler method should not introduce ghost methods");

            testSubscriber.MyValue.Should().Be(6);
        }
        public void DoesNotIntroduceGhostMethodsThroughRegistrationAndHandlingEvents()
        {
            this.testee = new EventBroker();

            ITestPublisher testPublisher = new MyPublisher();
            ITestSubscriber testSubscriber = new MySubscriber();

            int initialMethodCount = testSubscriber.GetType().GetMethods().GetLength(0);

            this.testee.Register(testPublisher);

            int methodCountAfterRegisteringPublisher = testSubscriber.GetType().GetMethods().GetLength(0);

            this.testee.Register(testSubscriber);

            int methodCountAfterRegisteringSubscriber = testSubscriber.GetType().GetMethods().GetLength(0);

            testPublisher.FireEvent();

            int methodCountAfterFiringEvent = testSubscriber.GetType().GetMethods().GetLength(0);

            methodCountAfterRegisteringPublisher.Should().Be(initialMethodCount, "registration of publisher should not introduce ghost methods");
            methodCountAfterRegisteringSubscriber.Should().Be(initialMethodCount, "registration of subscriber should not introduce ghost methods");
            methodCountAfterFiringEvent.Should().Be(initialMethodCount, "calling handler method should not introduce ghost methods");

            testSubscriber.MyValue.Should().Be(6);
        }
Exemple #3
0
 /// <summary>
 /// 初始化
 /// </summary>
 public Form1()
 {
     InitializeComponent();
     sendAddr     = ConfigurationManager.AppSettings["sendAddr"];
     sendHost     = ConfigurationManager.AppSettings["sendHost"];
     timeSpan     = Int32.Parse(ConfigurationManager.AppSettings["timeSpan"]);
     _myPublisher = new MyPublisher(sendAddr);
 }
Exemple #4
0
        public SubscriberForm()
        {
            InitializeComponent();

            m_Publisher  = new MyPublisher();
            m_Subscriber = new MySubscriber();

            Text = "Main Thread ID: " + Thread.CurrentThread.ManagedThreadId.ToString();
        }
Exemple #5
0
        public EventsClient()
        {
            InitializeComponent();

            m_Publisher  = new MyPublisher();
            m_Subscriber = new MySubscriber();

            m_Publisher.MyEvent += m_Subscriber.OnMyEvent;
            m_Publisher.MyEvent += m_Subscriber.OnMyEvent;
        }
Exemple #6
0
        void OnPublish(object sender, EventArgs e)
        {
            MyPublisher publisher  = new MyPublisher();
            IMyEvents   subscriber = (IMyEvents) new MySubscriber();

            publisher.Subscribe(subscriber, EventType.OnEvent1 | EventType.OnEvent2);
            publisher.SomeMethod(1);
            publisher.Unsubscribe(subscriber, EventType.OnEvent1);
            publisher.SomeMethod(2);
            publisher.Unsubscribe(subscriber, EventType.OnEvent2);
            publisher.SomeMethod(3);
            publisher.Subscribe(subscriber, EventType.OnAllEvents);
            publisher.SomeMethod(4);
            publisher.Unsubscribe(subscriber, EventType.OnAllEvents);
        }
Exemple #7
0
        static void Main(string[] args)
        {
            MyPublisher publisher  = new MyPublisher();
            Subscribe   subscribe  = new Subscribe(1, publisher);
            Subscribe   subscribe1 = new Subscribe(2, publisher);
            Subscribe   subscribe2 = new Subscribe(3, publisher);

            //subscribe.Mypublisher = publisher;

            publisher.RaiseEvent();
            Console.WriteLine();

            subscribe2.UnSUb();
            publisher.RaiseEvent();

            Console.ReadLine();
        }
Exemple #8
0
        public async Task UseCustomPublisherTests()
        {
            var mypublisher = new MyPublisher();
            var bus         = new Bus <int>(options => options.UseCustomPublisher(mypublisher));

            await bus.PublishAsync(55);

            await bus.PublishAsync(1);

            await bus.PublishAsync(5);

            Assert.Equal(3, mypublisher.Messages.Count);

            Assert.Equal(55, mypublisher.Messages[0]);
            Assert.Equal(1, mypublisher.Messages[1]);
            Assert.Equal(5, mypublisher.Messages[2]);
        }
        public async Task PublisherCustomDelegateEventRaisePublishesEventWithKeywordArguments()
        {
            WampPlayground playground = new WampPlayground();

            PublisherSubscriber dualChannel = await playground.GetPublisherSubscriberDualChannel();

            IWampChannel publisher  = dualChannel.Publisher;
            IWampChannel subscriber = dualChannel.Subscriber;

            MyPublisher myPublisher = new MyPublisher();

            IDisposable disposable =
                publisher.RealmProxy.Services.RegisterPublisher
                    (myPublisher);

            IWampTopicProxy topicProxy =
                subscriber.RealmProxy.TopicContainer.GetTopicByUri("com.myapp.topic2");

            MyCustomSubscriber myCustomSubscriber = new MyCustomSubscriber();

            IAsyncDisposable subscribe =
                await topicProxy.Subscribe(myCustomSubscriber,
                                           new SubscribeOptions());

            MyClass instance = new MyClass()
            {
                Counter = 1,
                Foo     = new[] { 1, 2, 3 }
            };

            myPublisher.RaiseMyEvent(37, 23, "Hello", instance);

            Assert.That(myCustomSubscriber.Arguments, Is.Empty);

            IDictionary <string, ISerializedValue> argumentsKeywords =
                myCustomSubscriber.ArgumentsKeywords;

            Assert.That(argumentsKeywords["number1"].Deserialize <int>(), Is.EqualTo(37));
            Assert.That(argumentsKeywords["number2"].Deserialize <int>(), Is.EqualTo(23));
            Assert.That(argumentsKeywords["c"].Deserialize <string>(), Is.EqualTo("Hello"));
            Assert.That(argumentsKeywords["d"].Deserialize <MyClass>(), Is.EqualTo(instance));
        }
        public void NoGhostMethodsAreIntroduced()
        {
            this.testee = new EventBroker();

            ITestPublisher testPublisher = new MyPublisher();
            ITestSubscriber testSubscriber = new MySubscriber();

            int methodCount = testSubscriber.GetType().GetMethods().GetLength(0);

            this.testee.Register(testPublisher);

            Assert.AreEqual(methodCount, testSubscriber.GetType().GetMethods().GetLength(0), "Registration of publisher introduced ghost methods.");

            this.testee.Register(testSubscriber);

            Assert.AreEqual(methodCount, testSubscriber.GetType().GetMethods().GetLength(0), "Registration of subscriber introduced ghost methods.");

            testPublisher.DoStuff();

            Assert.AreEqual(methodCount, testSubscriber.GetType().GetMethods().GetLength(0), "Calling handler method introduced ghost methods.");
            Assert.AreEqual(6, testSubscriber.MyValue);
        }
        public void NoGhostMethodsAreIntroduced()
        {
            this.testee = new EventBroker();

            ITestPublisher  testPublisher  = new MyPublisher();
            ITestSubscriber testSubscriber = new MySubscriber();

            int methodCount = testSubscriber.GetType().GetMethods().GetLength(0);

            this.testee.Register(testPublisher);

            Assert.AreEqual(methodCount, testSubscriber.GetType().GetMethods().GetLength(0), "Registration of publisher introduced ghost methods.");

            this.testee.Register(testSubscriber);

            Assert.AreEqual(methodCount, testSubscriber.GetType().GetMethods().GetLength(0), "Registration of subscriber introduced ghost methods.");

            testPublisher.DoStuff();

            Assert.AreEqual(methodCount, testSubscriber.GetType().GetMethods().GetLength(0), "Calling handler method introduced ghost methods.");
            Assert.AreEqual(6, testSubscriber.MyValue);
        }
        public static void TestEvent()
        {
            // Событие, это не что иное, как ситуация, при возникновении которой, произойдет действие или несколько действий. Говоря языком программного моделирования, Событие — это именованный делегат, при вызове которого, будут запущены все подписавшиеся на момент вызова события методы заданной сигнатуры.
            // Эта трактовка хоть и раскрывает всю суть структуры события, но не только сбивает с толку начинающих «шарп-прогеров», но и не дает возможность рационально представить в программистской голове весь смысл. 

            // пределено три класса. Первый класс будет считать до 100, используя цикл. Два других класса будут ждать, когда в первом классе счетчик досчитает, например, до 71, и после этого каждый выведет в консоль фразу «Пора действовать, ведь уже 71!». Проще говоря, при обнаружении значения 71, вызовутся по методу, соответственно для каждого класса. Разложим все по полкам.
            // события (event) основаны на делегатах (delegate), а делегат, говоря очень простым языком — «переменная, хранящая ссылку на метод». 
            // Далее, мы создаем событие при помощи ключевого слова event и связываем его с этим делегатом (MethodContainer), а, следовательно, c методами, имеющими сигнатуру void (void). Событие должно быть public, т.к. его должны использовать разные классы, которым нужно как-то отреагировать (классы Handler_I и Handler_II). 

            ClassCounter Counter = new ClassCounter();
            Handler_I Handler1 = new Handler_I();
            Handler_II Handler2 = new Handler_II();

            //Подписались на событие
            Counter.onCount += Handler1.Message;
            Counter.onCount += Handler2.Message;

            //Запустили счетчик
            Counter.Count();

            // Класс, в котором вы создаете событие (генерируете) называется классом-издателем, а классы, чьи методы подписываются на это событие при помощи "+=" — классами-подписчиками.
            // Вы всегда можете отписаться, используя оператор "-="
            // Преимущество Событий очевидно: классу-издателю, генерирующему событие не нужно знать, сколько классов-подписчиков подпишется или отпишется. Он создал событие для определенных методов, ограничив их делегатом по определенной сигнатуре. События широко используются для составления собственных компонентов управления (кнопок, панелей, и т.д.).

            // Пару слов о .NET-событиях. Microsoft упростила задачу конструирования делегатов: .NET предлагает готовый делегат EventHandler и т.н. «пакет» входных параметров EventArgs. Желаете событие? Берете готовый EventHandler, определяетесь в параметрах, «запихиваете» их в класс, а класс наследуете от EventArgs. А дальше — как по расписанию)
            
            // EventHandler<TEventArgs> - делегат
            // Represents the method that will handle an event when the event provides data.
            // [SerializableAttribute]
            // public delegate void EventHandler<TEventArgs>(
	        //      object sender,
	        //      TEventArgs e
            // )
            // sender - The source of the event.
            // e - Type: TEventArgs. An object that contains the event data.
            // TEventArgs - The type of the event data generated by the event.
            // The event model in the .NET Framework is based on having an event delegate that connects an event with its handler.To raise an event, two elements are needed:
            // - A delegate that refers to a method that provides the response to the event.
            // - Optionally, a class that holds the event data, if the event provides data.
            // The advantage of using EventHandler<TEventArgs> is that you do not need to code your own custom delegate if your event generates event data.You simply provide the type of the event data object as the generic parameter.

            Counter c = new Counter(new Random().Next(10));
            c.ThresholdReached += c_ThresholdReached;

            Console.WriteLine("press 'a' key to increase total");
            while (Console.ReadKey(true).KeyChar == 'a')
            {
                Console.WriteLine("adding one");
                c.Add(1);
            }

            // All events in the .NET Framework class library are based on the EventHandler delegate, which is defined as follows:
            // public delegate void EventHandler(object sender, EventArgs e);
            // To publish events based on the EventHandler pattern

            MyPublisher pub = new MyPublisher();
            Subscriber sub1 = new Subscriber("sub1", pub);
            Subscriber sub2 = new Subscriber("sub2", pub);

            // Call the method that raises the event.
            pub.DoSomething();

            // Keep the console window open
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();
        }
        public static void TestEvent()
        {
            // Событие, это не что иное, как ситуация, при возникновении которой, произойдет действие или несколько действий. Говоря языком программного моделирования, Событие — это именованный делегат, при вызове которого, будут запущены все подписавшиеся на момент вызова события методы заданной сигнатуры.
            // Эта трактовка хоть и раскрывает всю суть структуры события, но не только сбивает с толку начинающих «шарп-прогеров», но и не дает возможность рационально представить в программистской голове весь смысл.

            // пределено три класса. Первый класс будет считать до 100, используя цикл. Два других класса будут ждать, когда в первом классе счетчик досчитает, например, до 71, и после этого каждый выведет в консоль фразу «Пора действовать, ведь уже 71!». Проще говоря, при обнаружении значения 71, вызовутся по методу, соответственно для каждого класса. Разложим все по полкам.
            // события (event) основаны на делегатах (delegate), а делегат, говоря очень простым языком — «переменная, хранящая ссылку на метод».
            // Далее, мы создаем событие при помощи ключевого слова event и связываем его с этим делегатом (MethodContainer), а, следовательно, c методами, имеющими сигнатуру void (void). Событие должно быть public, т.к. его должны использовать разные классы, которым нужно как-то отреагировать (классы Handler_I и Handler_II).

            ClassCounter Counter  = new ClassCounter();
            Handler_I    Handler1 = new Handler_I();
            Handler_II   Handler2 = new Handler_II();

            //Подписались на событие
            Counter.onCount += Handler1.Message;
            Counter.onCount += Handler2.Message;

            //Запустили счетчик
            Counter.Count();

            // Класс, в котором вы создаете событие (генерируете) называется классом-издателем, а классы, чьи методы подписываются на это событие при помощи "+=" — классами-подписчиками.
            // Вы всегда можете отписаться, используя оператор "-="
            // Преимущество Событий очевидно: классу-издателю, генерирующему событие не нужно знать, сколько классов-подписчиков подпишется или отпишется. Он создал событие для определенных методов, ограничив их делегатом по определенной сигнатуре. События широко используются для составления собственных компонентов управления (кнопок, панелей, и т.д.).

            // Пару слов о .NET-событиях. Microsoft упростила задачу конструирования делегатов: .NET предлагает готовый делегат EventHandler и т.н. «пакет» входных параметров EventArgs. Желаете событие? Берете готовый EventHandler, определяетесь в параметрах, «запихиваете» их в класс, а класс наследуете от EventArgs. А дальше — как по расписанию)

            // EventHandler<TEventArgs> - делегат
            // Represents the method that will handle an event when the event provides data.
            // [SerializableAttribute]
            // public delegate void EventHandler<TEventArgs>(
            //      object sender,
            //      TEventArgs e
            // )
            // sender - The source of the event.
            // e - Type: TEventArgs. An object that contains the event data.
            // TEventArgs - The type of the event data generated by the event.
            // The event model in the .NET Framework is based on having an event delegate that connects an event with its handler.To raise an event, two elements are needed:
            // - A delegate that refers to a method that provides the response to the event.
            // - Optionally, a class that holds the event data, if the event provides data.
            // The advantage of using EventHandler<TEventArgs> is that you do not need to code your own custom delegate if your event generates event data.You simply provide the type of the event data object as the generic parameter.

            Counter c = new Counter(new Random().Next(10));

            c.ThresholdReached += c_ThresholdReached;

            Console.WriteLine("press 'a' key to increase total");
            while (Console.ReadKey(true).KeyChar == 'a')
            {
                Console.WriteLine("adding one");
                c.Add(1);
            }

            // All events in the .NET Framework class library are based on the EventHandler delegate, which is defined as follows:
            // public delegate void EventHandler(object sender, EventArgs e);
            // To publish events based on the EventHandler pattern

            MyPublisher pub  = new MyPublisher();
            Subscriber  sub1 = new Subscriber("sub1", pub);
            Subscriber  sub2 = new Subscriber("sub2", pub);

            // Call the method that raises the event.
            pub.DoSomething();

            // Keep the console window open
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();
        }