2012-03-16 2 views
3

У меня есть класс, который обрабатывает отправку & через сокет между моим приложением и сетью. Этот класс использует другие классы, включая класс соединения sockket низкого уровня и класс обработчика PDU, который создает сообщения для отправки и обработки полученных данных.Автоматическое создание пользовательских событий во время выполнения

Теперь я использую событие, чтобы сигнализировать моему классу, что для класса соединения низкого уровня есть данные для него, и мне нужно отправить эти данные обработчику PDU для преобразования информации, которую приложение может использовать, а затем передать данные в приложение ,

Для будущего использования, я пытаюсь получить класс как можно более общий, так что на будущих проектах Server/Client мне нужно будет только изменить обработчик PDU, чтобы принять во внимание новые доступные операции и как обрабатывать данные.

Все, что хорошо идет, и теперь я столкнулся с проблемой передачи данных обратно в приложение. Для этого мой логический подход - это событие, позволяющее приложению узнать, что данные готовы для сбора. Для этого я могу:

a) имеет одно событие и позволяет приложению сортировать, какое сообщение оно находится с помощью кода операции (выполнимо) b) Имейте одно событие за рабочий код и подписаться на все приложения из них и, таким образом, знать в начале, что он получает

Принимая во внимание идею создания общих вещей и подхода, изложенного в b, существует ли способ динамически создавать события на основе заданной подписи делегата во время выполнения?

e. г. представьте, у вас есть опкоды в перечислении называется MyOperation1 и MyOperation2 и вы определили делегат, как:

public delegate void PDUEventHandler(ParamType Param, [...]); 

и я хочу, чтобы определить события, называемые:

public event PDUEventHandler MyOperation1; 
public event PDUEventHandler MyOperation2; 

Но если я добавить новый код операции для этого мне понадобится событие.

Могут ли эти события быть созданы динамически или мне нужно сделать это вручную? Если мне нужно сделать это вручную, я думаю, что одно событие было бы лучше и обрабатывало бы сторону приложения.

+0

Я думаю, вам стоит пойти с вариантом A и использовать шаблон, например Chain of Responsibility (http://www.dofactory.com/Patterns/PatternChain.aspx), чтобы обрабатывать события, возможно, используя MEF (http: // msdn .microsoft.com/en-us/library/dd460648.aspx) для загрузки объектов, которые будут обрабатывать каждый вид кодов операций. – Fabio

+0

Интересная структура - не знает об этом - придется смотреть в него - хотя и имеет 1 класс каждого обработчика (в моем случае эксплуатации) кажется излишним - будет слишком глубже в том, что - спасибо – 537mfb

ответ

1

Возможно, вам нужен обратный вызов - по существу, вы передаете обработчику события делегат для его выполнения, когда обработчик выполнен. Here's a stackoverflow thread to give you an idea

С точки зрения обработчиков событий & повторное использование, возможно, вы можете расширить EventArgs и предоставить этот делегат в качестве свойства.

EDIT:

Я думал один PDUEventHandler, имеющий общий код и «дыру», где запускается пользовательский код. Этот пользовательский код передается обработчику как делегат (т. Е. Метод) или даже экземпляр класса. Но давайте немного изменим это ...

Похоже, вам нужен factory. Фактически вы практически описываете фабрику.

Концептуально отпустить идею передачи специальных кодов операций EventHandler по существу или с несколькими сигнатурами PDUEventHandler.

Создайте класс PDUHandlerFactory.Фабрика возвращает настраиваемый экземпляр в качестве общей ссылки класса PDUHandler. Затем вместо PDUEventHander у вас есть ссылка PDUHandler, которая указывает на заводской экземпляр.

+0

жаль - не совсем понял что вы имеете в виду - по сути, события C# - это обратные вызовы - так это то, что я сказал заранее - если вы имеете в виду отправить делегата на событие, которое было поднято, чем мы вернулись к необходимости приложения для регистрации n событий с моим основным классом и этот класс должен знать, с какой операцией его подключить, или понимаете, что вы ошибаетесь? – 537mfb

+0

, что идея фабрики может быть способом пойти - придется заглядывать в нее - havent работал с заводами в soooo долго - спасибо – 537mfb