我正在使用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服务实例的实例化。
答案 0 :(得分:3)
那不会奏效。
事件聚合器假定长寿命对象,首先订阅事件然后活得足够长的对象以获取通知。
WCF服务实例是短生命对象。请求开始后会激活一个实例,并在请求完成后删除。
您的发布者和订阅者在同一时刻生活的可能性很低,正如您所注意到的,订阅者尚未创建。
我相信您的问题源于您滥用事件聚合器这一事实。 wcf服务可以发布事件,但是wcf服务没有必要是在事件聚合器中注册的订户。一个wcf服务已经是一个订阅者 - 它可以被其他生物调用,通知&#34;通知&#34;它只是通过调用它。
如果您希望自己的服务能够通知&#34;其他服务,只需拨打这些其他服务,因为您通常会打电话给他们。