PRISM和WCF - 他们玩得好吗?

时间:2009-10-20 00:19:33

标签: wcf events prism

2 个答案:

答案 0 :(得分:5)

这是一种非常有趣的方法。我只想说两件事:

  1. 如果您使用字符串和对象参数,您真的会遇到麻烦。强类型的EventAggregator事件(继承自CompositeEvent)是这里的方法。如果你这样做,可维护性将会提升。
  2. 您的WCF模型 - > EventAggregator应该将来自EventAggregator的所有视为“事件”,并将来自WCF服务的所有内容视为“消息”。您应该真正考虑的是,您实际上是将EventAggregator事件转换为消息,而不是询问“如何引发WCF事件”。
  3. 我认为你所做的是可行的。看看你的实现,我真的很喜欢你的想法。


    轻微替代品(带强打字)

    我想在那里抛出一些东西,看看你对它的看法......也许它会稍微影响你的设计。具体来说,这是为了解决我上面的第一点,并进一步强调打字。

    您是否考虑过使用EventAggregator支持的服务接口实现?假设您的示例中包含您正在使用的IWeatherService WCF服务。目前,据我了解,您的用法将如下所示:

    1. 客户端使用WCF事件客户端库并调用RaiseEvent(“ChangeWeather”,Weather.Sunny);
    2. WCF事件客户端库将此转换为对WCF服务的适当调用,等待接收此消息,使用IWeatherService通道接口执行此操作。可能有一个基于方法调用名称的大讨厌的switch语句。
    3. 为什么不稍微修改一下。使IWeatherService成为所有服务器和客户端之间的共享契约。显然,服务器将具有实际的实现,但是客户端将具有EventAggregator支持的实现,这些实现将转发到中央代理,该代理将消息排队并发送到服务器。

      编写一个EventAggregator支持的IWeatherService实现,该实现引发由中央消息代理接收的事件,并将该实现抛出到容器中供客户端使用。

      public ClientWeatherService : IWeatherService
      {
      
          IEventAggregator _aggregator;
          public ClientWeatherService(IEventAggregator aggregator) 
          { 
              _aggregator = aggregator; 
          }
      
          public void ChangeWeather(Weather weather)
          {
              ChangeWeatherEvent cwEvent = _aggregator.GetEvent<ChangeWeatherEvent>();
              cwEvent.Publish(weather);
          }
      }
      

      从那里,他们不是直接使用“WCF Event Client Library”,而是直接使用IWeatherService,而不知道它不会调用实际的服务。

      public MyWeatherViewModel : ViewModel
      {
          IWeatherService _weatherService;
          public MyWeatherViewModel(IWeatherService weatherService)
          {
              _weatherService = weatherService;
          }
      }
      

      然后,您需要设置一些事件处理程序来使WCF调用真实服务,但现在您可以从客户端进行强类型操作。

      只是一个想法。

      我真的很喜欢这类问题。我希望更多的人会在Stackoverflow上问这种事情。让大脑在早上移动:)

答案 1 :(得分:0)

这似乎是一个解决问题的复杂方法。

您是从客户端应用程序中提升事件,还是使用回调合同从服务中提升事件?或两者兼而有之?

我会在客户端使用简单的服务类来解决这个问题。它可以实现Callback合约,对于每个回调方法,它只能在本地向客户端中的任何订户引发Prism事件。如果您需要引发服务处理的事件,那么服务类可以订阅这些事件并调用wcf服务。

您真正需要的是一个将wcf服务的细节抽象出客户端的类,并通过Prism事件公开它的接口。

我个人不希望修改/扩展基础架构组件并创建对具体wcf服务的依赖。