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

本文关键字:服务 Unity WCF 事件 Prism | 更新日期: 2023-09-27 17:51:02

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

问题:

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

场景:如果我使用的WCF服务既充当订阅者,也充当发布者,而服务订阅者实例还没有创建而事件被触发,那么由于此时订阅者实例还没有创建,该如何处理这个问题呢?(不过注册已经完成)。

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

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

可能的解决方案:我正在寻找Unity应用程序块来解决这个依赖关系,但想知道这是否是正确的方向。为此,我正在考虑在global.asax.cs应用程序启动方法中做这样的事情:

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

然后我可以

EventPublisher = container.Resolve<EventPublisher>();

其中EventPublisher类的元素是

 public EventPublisher(ISubscribeEvent obj)
        {
        }

,其中issubscribeevent将是每个订阅者将实现的接口。因此,每当引发事件时,实现issubscribeevent接口的类将被实例化。

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

编辑:


事件将发生在服务器上,订阅者也将是服务器上的服务,即服务到服务的调用将不会通过通道,而是作为正常的类调用。

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

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

不行

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

WCF服务实例是短期对象。实例在请求开始时被激活,在请求完成时被删除。

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

我相信你的问题源于你在那里滥用事件聚合器。wcf服务可以发布事件,但wcf服务没有必要成为在事件聚合器中注册的订阅者。wcf服务已经是一个订阅者——它可以被其他生命体调用,通过调用它来"通知"它。

如果你想让你的服务"通知"其他服务,只需像你通常调用它们一样调用这些其他服务。