2009-11-12 39 views
0

是否可以从ServiceHost中检索具体类实例,以便为该类的事件添加事件处理程序?为WCF具体类实例添加事件处理程序

Public Class Widget 
     Public Event MessageCalled(sender as object, e as EventArgs) 
     Public Sub DoSomething() 
     '-- do a whole lot of stuff --' 
     RaiseEvent MessageCalled(Me, new EventArgs()) 
     End Sub 
End Class 


Private _host As New ServiceHost(GetType(Widget), New Uri() {New Uri("http://localhost:50000")}) 

所以当客户端调用DoSomething()方法时,我可以处理主机上的MessageCalled()事件。

我发现的大部分内容都是关于处理客户端事件的,但我对此不感兴趣。

回答

1

我想你最好使用WCF运行时提供的扩展点,而不是尝试使用像这样的事件。要开始,请查看名为Extending WCF的SDK部分。

如果您提供了更多关于您想要达到的内容的更多详细信息,我们可以提供一些更具体的关于如何操作的建议,但通过您的示例代码进行修改,看起来就像您只想参与每封邮件即与您的服务交换,以便您可以记录一些信息?如果是这种情况,那么你可能想要实现一个IDispatchMessageInspector

+0

谢谢。看起来像我可以这样做,但是,正如上面提到的,我正在调整的代码是早先使用远程处理的遗留代码。我认为从长远来看,我会更好地重构以更好地适应WCF。 – Jayden 2009-11-13 01:28:38

1

我不完全明白你想要做什么,但我想你想从服务主机获取服务类实例?

嗯,想一想:如果你有一个繁忙的系统上的服务主机,有一个很好的机会,你可以在同一时间被服务多个并发客户端请求。默认情况下,在WCF中,每个客户端请求都会获得自己的服务类实例,这也意味着WCF运行时可能会从服务主机中旋转多个“Widget”实例 - 这n个实例中的哪一个是您想?

ServiceHost和它的托管服务类之间通常没有1:1的关系....或者至少你不能依赖那个是1:1的关系。我不知道有什么办法让ServiceHost实例获得单个(或多个)服务类实例,对不起。

我想你需要重新考虑一下你的设计,并找到一种方法来以不同的方式解决这个需求。我现在不认为WCF可以做你想做的事情。

+0

谢谢。我认为我会重构。该代码是使用远程处理的遗留代码,并使用主机和客户端之间通用的独立库。主持人'听'了事件的公共对象。 我只是将接口保存在公共库中,并将该类的实现从公共库移出到主机代码中。 – Jayden 2009-11-13 01:27:34

相关问题