This is a mirror of official site: http://jasper-net.blogspot.com/

Проверяем наличие подписчиков у событий при помощи Reflection

| Tuesday, February 22, 2011
Передо мной встала задача, нужно было бы собрать все события объекта и подписаться на них (подписать определенный метод), только в том случае, если на это событие не подписан кто-то еще. Я могу даже больше сказать, делал я это для классов-оберток, которые генерирует Visual Studio на Add Reference Service…. Используем мы их по стандартному, как и все, наверное. Используем в коде не сами классы-обертки, которые генерирует Visual Studio, а используем свои реализации, которые нам предоставляют возможность тестировать наши модели, подставляя Mock и Stub объекты вместо самих реализаций. Давайте лучше покажу на примере.
Заголовок для этой заметки достаточно сложно было придумать. Проверка наличия подписчиков – это все-таки малая сердцевина того, что я тут описываю, но я думаю это просто самая интересная часть. В целом, я тут описываю вариант обработки результатов от методов сервисов в Silverlight приложении.
Пускай на сервере есть самый обычный WCF Service, в котором есть всего один метод:
public class MyService : IMyService
{
   public bool DoWork(string str)
   {
       throw new NotImplementedException();
   }
}
В Silverlight проекте мы сделаем Reference на этот сервис. Visual Studio сгенерирует нам класс обертку. Напишем небольшой базовый метод для всех клиентских классов-оберток для сервисов:
public abstract class ServiceBase<TClient> where TClient : class, new()
{
   protected ServiceBase()
   {
       Client = new TClient();
   }

   public TClient Client { get; set; }

   protected void ProcessResult<T>(AsyncCompletedEventArgs eventArgs, T result)
   {
       Action<AsyncResult<T>> action = eventArgs.UserState as Action<AsyncResult<T>>;

       if (action == null)
           throw new NotSupportedException("Unexpected type in UserState.");

       action(new AsyncResult<T>() { Result = result });
   }

   protected void ProcessResult(AsyncCompletedEventArgs eventArgs)
   {
       Action<AsyncResult> actionVoidResponce = eventArgs.UserState as Action<AsyncResult>;

       if (actionVoidResponce == null)
           throw new NotSupportedException("Unexpected type in UserState.");
           
       actionVoidResponce(new AsyncResult());
   }

   protected void ProcessError<T>(AsyncCompletedEventArgs eventArgs)
   {
       Action<AsyncResult<T>> action = eventArgs.UserState as Action<AsyncResult<T>>;

       if (action == null)
           throw new NotSupportedException("Unexpected type in UserState.");

       action(new AsyncResult<T>() { Exception = eventArgs.Error });
   }


Read more: outcoldman

Posted via email from Jasper-net

0 comments: