Prism事件聚合器和WCF服务和Unity

时间:2015-05-29 04:38:33

标签: c# wcf unity-container prism

我正在使用prism事件聚合器来触发和关联事件(发布和订阅)。只有在请求服务时才会实例化该服务。来自客户端(通过渠道)或来自其他服务(作为类对象)。

问题:

  • 如果事件未订阅(注册和实例化),那么即使它没有发布任何内容 发生,即不会调用处理程序。

情境: 如果我正在使用让我们说作为我们的订阅者和发布者的WCF服务并且服务子服务器实例尚未创建并且事件被触发,那么可以采取什么措施来解决这个问题。指向尚未创建订户实例。 (虽然注册已经完成)。

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

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

可能的解决方案:我正在查看Unity应用程序块以解决此依赖关系,但希望找到这个是正确的方向。为此我想在global.asax.cs应用程序启动方法中执行类似的操作:

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

然后我可以

EventPublisher = container.Resolve<EventPublisher>();

其中EventPublisher类的ctor是

 public EventPublisher(ISubscribeEvent obj)
        {

        }

其中ISubscribeEvent将是每个订户将实现的接口。因此,无论何时引发事件,实例化ISubscribeEvent接口的类都将被实例化。

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

修改
事件将发生在服务器上,订户也将是服务器上的服务,即服务呼叫服务不会通过频道,而是作为正常的班级呼叫。

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

1 个答案:

答案 0 :(得分:3)

那不会奏效。

事件聚合器假定长寿命对象,首先订阅事件然后活得足够长的对象以获取通知。

WCF服务实例是短生命对象。请求开始后会激活一个实例,并在请求完成后删除。

您的发布者和订阅者在同一时刻生活的可能性很低,正如您所注意到的,订阅者尚未创建。

我相信您的问题源于您滥用事件聚合器这一事实。 wcf服务可以发布事件,但是wcf服务没有必要是在事件聚合器中注册的订户。一个wcf服务已经是一个订阅者 - 它可以被其他生物调用,通知&#34;通知&#34;它只是通过调用它。

如果您希望自己的服务能够通知&#34;其他服务,只需拨打这些其他服务,因为您通常会打电话给他们。