Using services on the Server side
You have several methods to retrieve a TServiceFactory
instance, either from the service name, its GUID, or its index in the list.
That is, you may code:
var I: ICalculator;
begin
if Server.Services['Calculator'].Get(I)) then
result := I.Add(10,20);
end;
or, for a a more complex service:
var CN: IComplexNumber;
begin
if not Server.Services.Info(TypeInfo(IComplexNumber)).Get(CN) then
exit; // IComplexNumber interface not found
CN.Real := 0.01;
CN.Imaginary := 3.1415;
CN.Add(100,200);
assert(SameValue(CN.Real,100.01));
assert(SameValue(CN.Imaginary,203.1415));
end; // here CN will be released
You can of course cache your TServiceFactory instance within a
local field, if you wish.
Client side
There is no implementation at all on the client side. This is the magic of mORMot's services: no Wizard to call (as in DataSnap), nor client-side methods to write - as with our method-based service implementation.
In fact, a hidden "fake" TInterfaceObject class will be created
by the framework (including its internal VTable and low-level
assembler code), and used to interact with the remote server. But you do not
have to worry about this process: it is transparent to your code.
Set up the Client factory
On the client side, you have to register the corresponding interface, as such:
Client.ServiceRegister([TypeInfo(ICalculator)],sicShared);
It is very close to the Server-side registration, despite the fact that we do not provide any implementation class here. Implementation will remain on the server side.
Note that the implementation mode (here sicShared) shall match
the one used on the server side. An error will occur if this setting is not
coherent.
The other IComplexNumber interface we talked about, is defined
as such:
Client.ServiceRegister([TypeInfo(IComplexNumber)],sicClientDriven);
To be more precise, this registration step is indeed not mandatory on the
client side. If you use the TServiceContainerClient.Info() method,
the client-side implementation will auto-register the supplied interface, in
sicClientDriven implementation mode.
Using services on the Client side
Once the service is registered on the client side, it is very easy to use it in your code.
You can use the same methods as on the server side to retrieve a
TServiceFactory instance.
That is, you may code:
var I: ICalculator;
begin
if Client.Services['Calculator'].Get(I)) then
result := I.Add(10,20);
end;
or, for a a more complex service, initialized in
sicClientDriven:
var CN: IComplexNumber;
begin
if not Client.Services.Info(TypeInfo(IComplexNumber)).Get(CN) then
exit; // IComplexNumber interface not found
CN.Real := 0.01;
CN.Imaginary := 3.1415;
CN.Add(100,200);
assert(SameValue(CN.Real,100.01));
assert(SameValue(CN.Imaginary,203.1415));
end; // here CN will be released on both client AND SERVER sides
You can of course cache your TServiceFactory instance within a
local field, if you wish.
The code is just the same as on the server.
The only functional change is that the execution will take place on the server
side (using the registered TServiceComplexNumber implementation
class), and the corresponding class instance will remain active until the
CN local interface will be released on the client.
As we stated in the previous paragraph, since the
IComplexNumber is to be executed as sicClientDriven,
it is not mandatory to call the Client.ServiceRegister method for
this interface. In fact, during
Client.Services.Info(TypeInfo(IComplexNumber)) method execution,
the registration will take place, if it has not been done explicitly before.
For code readability, it may be a good idea to explicitly register the
interface on the client side also, just to emphasize that this interface is
about to be used, and in which mode.
Continue reading...
This article is part of a list of other blog articles, extracted from the official Synopse mORMot framework documentation:- Interface based services;
- Defining a data contract;
- Service side implementation;
- Using services on the Client or Server sides;
- Interface based services implementation details;
- WCF, mORMot and Event Sourcing.
Feedback and questions are welcome on our forum, just as usual.
