2015-05-29 50 views
0

我正在使用棱镜事件聚合器来触发和关联事件(发布和订阅)。该服务仅在有请求时才被实例化。从客户端(通过通道)或从另一个服务(作为类对象)。棱镜事件聚合器和WCF服务和Unity

问题:

  • 如果事件没有签约(注册和实例化),那么即使它没有 发生即没有处理程序将被称为出版。

场景: 如果我使用可以说,作为我们的用户,也出版商和服务subsriber实例尚未创建和事件被触发,可以做些什么来WCF服务处理这一点,因为此时用户实例尚未创建。 (虽然注册已完成)。

注意:我正在订阅服务的ctor中的事件。

因此,简而言之,我期望在发布(事件触发器调用)之前确保所有订阅者都是instanstiated的。

可能的解决方案:我在看Unity应用程序块来解决这种依赖性,但想要发现,如果这是正确的方向。为了这个目的,我想在的global.asax.cs应用程序启动方法做这样的事情的:

IUnityContainer container = new UnityContainer(); 
container.RegisterType<ISubscribeEvent ,EventSubsriber>(); 

,然后我可以

EventPublisher = container.Resolve<EventPublisher>(); 

其中EventPublisher类的构造函数是

public EventPublisher(ISubscribeEvent obj) 
     { 

     } 

其中ISubscribeEvent将成为每个用户将实现的接口。所以无论何时发生事件,实现ISubscribeEvent接口的类都将被实例化。

这种方法有意义吗?有没有其他的选择?

编辑:
事件将发生在服务器和用户也将是服务器即服务呼叫服务将无法通过该通道,但作为普通类调用回事服务。

更新: 我还看了IInstanceProvider here,因为它可以提供一个接口,它可以用于控制使用Unity.WCF WCF服务实例的实例化。

回答

3

这是行不通的。

事件聚合器假定长时间存在的对象,首先订阅事件,然后活到足以获取通知的对象。

WCF服务实例是短暂存在的对象。一旦请求开始,一个实例就会被激活,一旦请求完成就会被删除。

您发布商和订阅者都处于相同时刻的概率很低,因为您已经注意到订阅者尚未创建。

我相信你的问题源于你滥用事件聚合器的事实。 wcf服务可以发布事件,但是在事件聚合器中注册的用户是wcf服务没有意义。一个wcf服务已经是一个订阅者 - 它可以被其他生物调用,通过调用它来“通知”它。

如果您希望您的服务“通知”其他服务,只需调用这些其他服务,就像您通常所称的那样。

+0

我最初做了一些研究,看到http://stackoverflow.com/questions/1591829/prism-and-wcf-do-they-play-nice?rq=1,它让我想到WCF和Prism事件可能会附和。如果我使用基础架构模块来订阅事件,并且可以减轻无实例用户的可能性,那么我可以解决问题。你同意或者我应该放弃这种方法。感谢您的输入。 –

+0

另外请检查我的编辑:) –

+0

如果发生这种情况发生在服务器上,让其他一些长寿命物体成为订户。具体来说,看看应该为这种长期生活任务提供基础设施的Hangfire库。 –