Могу ли / должен ли я использовать макет для динамического добавления событий в класс? - PullRequest
1 голос
/ 31 марта 2009

Рассмотрим следующий интерфейс:

public interface IMyCallback
{
  void SomeEvent(int someArg);
}

, который является контрактом для обратного вызова WCF, который будет получать "события" от службы WCF. Моя реализация для этого интерфейса выглядит следующим образом

public class MyCallback : IMyCallback
{
  void IMyCallback.SomeEvent(int someArg)
  {
    OnSomeEvent(someArg);
  }

  protected virtual void OnSomeEvent(int someArg)
  {
    EventHandler<SomeEventArgs> handler = this.SomeEvent;

    if (handler != null)
    {
      handler(this, new SomeEventArgs(someArg));
    }
  }

  public event EventHandler<SomeEventArgs> SomeEvent;
}

, что позволяет мне создать экземпляр обратного вызова и перехватить событие SomeEvent в моем клиентском коде. Всякий раз, когда сервер вызывает мой обратный вызов, я получаю это простое старое событие .NET. Все отлично работает.

Здесь возникает вопрос: я хотел бы написать фабричный класс для автоматизации создания этого обратного вызова, чтобы я легко использовал этот подход во всех своих проектах и ​​с любым интерфейсом. Завод будет называться так:

var myCallback = CallbackFactory.CreateCallback<IMyCallback>();

Могу ли / должен ли я использовать фальшивую среду для динамического создания этого класса, или я должен укусить пулю и выпустить IL напрямую? Или я должен просто передать код каждой реализации? Или есть другой подход, о котором я не думаю?

Ответы [ 2 ]

1 голос
/ 31 марта 2009

Вы можете использовать DynamicProxy * для Project Castle , который должен предоставить вам всю необходимую инфраструктуру для генерации прокси. Тогда вам не нужно беспокоиться об эмиссии IL, которая может иметь неприятные побочные эффекты, если не все сделано правильно.

Я не знаю, как вы хотите присоединиться к событию в пользовательском коде при использовании прокси, просто потому, что ваш IMyCallback не имеет фактического события в нем, только вызванного. Или я неправильно понял ваш вопрос?

0 голосов
/ 31 марта 2009

Я думаю, что использование фреймворка хорошо. По сути, фреймворк-заглушка - это не что иное, как способ легко обеспечить реализации определений типов для известных входных данных.

Поскольку это именно то, что вы делаете здесь, я говорю, что идти с этим.

...