WCF中的事件代表类比

时间:2012-06-26 14:21:43

标签: c# .net wcf

我已经实现了MVC模式的WinForms应用程序,其中Model从View(Form)异步运行(backgroundWorker线程)。 View订阅了从Model中引发的几个事件。

现在我需要将其转换为WCF应用程序,其中必须存在event-eventHandler概念 起初,我想通过回调接口实现这个,但在我的情况下,Model中的一个方法引发了多种类型的事件,并且在定义服务契约时我受限于单个回调接口的使用。

此时我想出了将不同类型的事件指定为回调服务中的方法并在客户端中实现它的想法。例如:

public interface ICallbacks
{
  [OperationContract(IsOneWay = true)]
  void EventHandler1();

  [OperationContract(IsOneWay = true)]
  void EventHandler2(string callbackValue);

  [OperationContract(IsOneWay = true)]
  void EventHandler3(string callbackValue);
}

我应该继续使用这个解决方案还是有更好的选择(发布 - 订阅wcf模式)?

3 个答案:

答案 0 :(得分:0)

听起来你肯定想要这里的pub / sub架构。

从这篇MSDN文章中查看Juval Lowy的Publish-Subscribe Framework: http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

答案 1 :(得分:0)

您可以使用带有基本类型参​​数的单一方法来激活您的呼叫。然后在您的服务代码中,根据事件的类型跳转到特定的处理程序。

public class BaseEvent { }

public class MyFirstEvent : BaseEvent { }

public class MySecondEvent : BaseEvent { }

public class MyThirdEvent : BaseEvent { }


public interface ICallbacks
{
  [OperationContract(IsOneWay = true)]
  void EventHandler(BaseEvent myEvent);
}

public class MyService : ICallbacks
{
   public void EventHandler(BaseEvent myEvent)
   {
      //Now you can check for the concrete type of myEvent and jump to specific method.
      //e.g.: 
      if (myEvent is MyFirstEvent)
      {
         //Call your handler here.
      }


      //Another approach can be predefined dictionary map of your event handlers
      //You want to define this as static map in class scope, 
      //not necessarily within this method.
      Dictionary<Type, string> map = new Dictionary<Type, string>()
      {
         { typeof(MyFirstEvent), "MyFirstEventHandlerMethod" },
         { typeof(MySecondEvent), "MySecondEventHandlerMethod" }
         { typeof(MyThridEvent), "MyThirdEventHandlerMethod" }
      };

      //Get method name from the map and invoke it.
      var targetMethod = map[myEvent.GetType()];
      this.GetType().GetMethod(targetMethod).Invoke(myEvent);
   }
}

答案 2 :(得分:0)

使用双工不是一个好主意,除非您的应用程序至少在同一网络上运行,并且没有代理等干扰。您最终还会在发布者和订阅者之间建立紧密联系。