2

我有实现 MVC 模式的 WinForms 应用程序,其中模型从视图(表单)异步运行(后台工作线程)。View 订阅了从 Model 引发的几个事件。

现在我需要将其转换为 WCF 应用程序,其中必须存在 event-eventHandler 概念。
起初,我想通过回调接口来实现这一点,但在我的例子中,模型中的一种方法引发了不止一种类型的事件,并且在定义服务合同时我受限于单个回调接口的使用。

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

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

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

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

我应该接受这个解决方案还是有一些更好的选择(发布-订阅 wcf 模式)?

4

3 回答 3

0

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

从这篇 MSDN 文章中查看 Juval Lowy 的发布-订阅框架:http: //msdn.microsoft.com/en-us/magazine/cc163537.aspx

于 2012-06-26T14:28:20.443 回答
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);
   }
}
于 2012-06-26T14:35:21.273 回答
0

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

于 2012-06-26T15:26:01.983 回答