1

考虑以下接口:

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?还是我应该只手动编写每个实现的代码?还是有另一种我没有想到的方法?

4

2 回答 2

1

您可以使用Castle Project 的 DynamicProxy,它应该为您提供生成代理所需的所有基础设施。那么您不必担心发出 IL,如果操作不当,可能会产生令人讨厌的副作用。

我不知道在使用代理时您想如何附加到用户代码中的事件,仅仅是因为您的 IMyCallback 没有实际事件,只有调用的事件。还是我误解了你的问题?

于 2009-03-31T17:15:37.650 回答
0

我认为使用模拟框架很好。从本质上讲,模拟/存根框架只不过是一种为已知输入轻松提供类型定义实现的方法。

既然这正是你在这里所做的,我说那就去吧。

于 2009-03-31T17:15:43.080 回答