我们还需要在Service类中定义发送Request消息的行为,通过它,才能使业务服务被RequestListener所侦听。
public IMessageItemSequence SendRequest(string aServiceName,string aMessageName,IMessageItemSequence aMessageBody)
...{
IMessage message = m_Factory.CreateMessage();
message.SetMessageName(aMessageName);
message.SetMessageID("");
message.SetMessageBody(aMessageBody);
IService service = FindService(aServiceName);
IMessageItemSequence replyBody = m_Factory.CreateMessageItemSequence();
if (service != null)
...{
IMessage replyMessage = service.Execute(message);
replyBody = replyMessage.GetMessageBody();
}
else
...{
replyBody.SetValue("result","Failure");
}
return replyBody;
}
注意SendRequest()方法的定义,其参数包括服务名,消息名和被发送的消息主体。而在实现中最关键的一点是FindService()方法。我们要查找的服务正是与之对应的RequestListener服务。不过,在此之前,我们还需要先将服务Marshal:
public void Initialize()
...{
RemotingServices.Marshal(this.m_RequestListener,this.m_ServiceName +".RequestListener");
}
我们Marshal的对象,是业务服务中的Request服务对象m_RequestListener,这个对象在Service的构造函数中被实例化:
m_RequestListener = new RequestListener(this);
注意,在实例化的时候是将this作为IListenService对象传递给RequestListener。因此,此时被Marshal的服务对象,保留了业务服务本身即Service的指引。可以看出,在Service和RequestListener之间,采用了“双重委派”的机制。
通过调用Initialize()方法,初始化了一个服务对象,其类型为RequestListener(或IService),其服务名为:Service的服务名 + ".RequestListener"。而该服务正是我们在SendRequest()方法中要查找的Service:
IService service = FindService(aServiceName);
下面我们来看看FindService()方法的实现:
protected IService FindService(string aServiceName)
...{
lock (this.m_Services)
...{
IService service = (IService)m_Services[aServiceName];
if (service != null)
...{
return service;
}
else
...{
IService tmpService = GetService(aServiceName);
AddService(aServiceName,tmpService);
return tmpService;
}
}
}
可以看到,这个服务是被添加到m_Service对象中,该对象为SortedList类型,服务名为Key,IService对象为Value。如果没有找到,则通过私有方法GetService()来获得:
private IService GetService(string aServiceName)
...{
