答案 0 :(得分:5)
这是一种非常有趣的方法。我只想说两件事:
我认为你所做的是可行的。看看你的实现,我真的很喜欢你的想法。
我想在那里抛出一些东西,看看你对它的看法......也许它会稍微影响你的设计。具体来说,这是为了解决我上面的第一点,并进一步强调打字。
您是否考虑过使用EventAggregator支持的服务接口实现?假设您的示例中包含您正在使用的IWeatherService WCF服务。目前,据我了解,您的用法将如下所示:
为什么不稍微修改一下。使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服务的依赖。