Prism 事件聚合器和 WCF 服务以及 Unity
Prism Event Aggregators and WCF Services and Unity
我正在使用 prism 事件聚合器来触发和关联事件(发布和订阅)。只有在有请求时才会实例化该服务。来自客户端(通过通道)或来自其他服务(作为 class 对象)。
问题:
- 如果一个事件没有被订阅(注册和实例化)那么即使它没有被发布
发生,即不会调用任何处理程序。
场景:
如果我正在使用假设 WCF 服务作为我们的订阅者和发布者并且 服务订阅者实例尚未创建 并且事件被触发,那么可以做什么来处理这个因为因为此时尚未创建订户实例。 (虽然注册已经完成)。
注意:我正在服务的 ctor 中订阅事件。
所以,简而言之,我希望确保在发布(事件触发调用)之前实例化所有订阅者。
可能的解决方案: 我正在查看 Unity 应用程序块来解决此依赖关系,但想知道这是否是正确的方向。为此,我正在考虑在 global.asax.cs 应用程序启动方法中做这样的事情:
IUnityContainer container = new UnityContainer();
container.RegisterType<ISubscribeEvent ,EventSubsriber>();
然后我可以
EventPublisher = container.Resolve<EventPublisher>();
EventPublisher class 的负责人是
public EventPublisher(ISubscribeEvent obj)
{
}
其中 ISubscribeEvent 将是每个订阅者都将实现的接口。因此,无论何时引发事件,都会实例化 class 实现 ISubscribeEvent 接口。
这种方法有意义吗?还有其他选择吗?
编辑:
事件将发生在服务器上,订阅者也将是服务器上的服务,即服务到服务的调用不会通过通道,而是正常的 class 调用。
更新:
我还查看了 IInstanceProvider here,因为它可以提供一个接口,可用于使用 Unity.WCF.
控制 WCF 服务实例的实例化
那不行。
事件聚合器假定长期存在的对象,即首先订阅事件然后存活足够长的时间以获取通知的对象。
WCF 服务实例是短期对象。请求开始后实例被激活,请求完成后实例被删除。
您的发布者和订阅者同时存在的可能性很低,正如您所注意到的,订阅者尚未创建。
我认为您的问题源于您在那里滥用事件聚合器这一事实。 wcf 服务可以发布事件,但作为在事件聚合器中注册的订阅者,wcf 服务毫无意义。 wcf 服务已经是订阅者 - 它可以被其他人调用 "notify" 只需调用它即可。
如果您希望将您的服务用于 "notify" 其他服务,只需像通常那样调用这些其他服务即可。
我正在使用 prism 事件聚合器来触发和关联事件(发布和订阅)。只有在有请求时才会实例化该服务。来自客户端(通过通道)或来自其他服务(作为 class 对象)。
问题:
- 如果一个事件没有被订阅(注册和实例化)那么即使它没有被发布 发生,即不会调用任何处理程序。
场景: 如果我正在使用假设 WCF 服务作为我们的订阅者和发布者并且 服务订阅者实例尚未创建 并且事件被触发,那么可以做什么来处理这个因为因为此时尚未创建订户实例。 (虽然注册已经完成)。
注意:我正在服务的 ctor 中订阅事件。
所以,简而言之,我希望确保在发布(事件触发调用)之前实例化所有订阅者。
可能的解决方案: 我正在查看 Unity 应用程序块来解决此依赖关系,但想知道这是否是正确的方向。为此,我正在考虑在 global.asax.cs 应用程序启动方法中做这样的事情:
IUnityContainer container = new UnityContainer();
container.RegisterType<ISubscribeEvent ,EventSubsriber>();
然后我可以
EventPublisher = container.Resolve<EventPublisher>();
EventPublisher class 的负责人是
public EventPublisher(ISubscribeEvent obj)
{
}
其中 ISubscribeEvent 将是每个订阅者都将实现的接口。因此,无论何时引发事件,都会实例化 class 实现 ISubscribeEvent 接口。
这种方法有意义吗?还有其他选择吗?
编辑:
事件将发生在服务器上,订阅者也将是服务器上的服务,即服务到服务的调用不会通过通道,而是正常的 class 调用。
更新: 我还查看了 IInstanceProvider here,因为它可以提供一个接口,可用于使用 Unity.WCF.
控制 WCF 服务实例的实例化那不行。
事件聚合器假定长期存在的对象,即首先订阅事件然后存活足够长的时间以获取通知的对象。
WCF 服务实例是短期对象。请求开始后实例被激活,请求完成后实例被删除。
您的发布者和订阅者同时存在的可能性很低,正如您所注意到的,订阅者尚未创建。
我认为您的问题源于您在那里滥用事件聚合器这一事实。 wcf 服务可以发布事件,但作为在事件聚合器中注册的订阅者,wcf 服务毫无意义。 wcf 服务已经是订阅者 - 它可以被其他人调用 "notify" 只需调用它即可。
如果您希望将您的服务用于 "notify" 其他服务,只需像通常那样调用这些其他服务即可。