ice.NET Service Builder
The ice.NET Service Builder is a tool to generate the service interface
implementation (interoperability layer, adapter) out of a service configuration
as described in Service Configuration. The
Service Builder can generate interfaces for various connection technologies:
- ASP.NET Web Service implementation
- ASP.NET Web Service client
- Rich Client Service Interface (direct database access)
- Abstract client interface implemented by Web Service and Rich Client
The following diagram illustrates how the Service Builder works:
As a prerequisite for running the Service Builder, the business logic must be compiled into
modules (assemblies, Business Logic DLLs). The Service Builder consumes a configuration
file (.iceservice Format) that references these DLLs and contains a list of method categories
and a list of products to be produced. For each of the products the Service Builder generates
one or more source code files that can be included into appropriate development projects.
Compiling the generated source code is not part of the Service Builder process.
A typical service configuration file looks like this:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ServiceBuilder>
<Service Name="Walkthrough" DisplayName="Walkthrough Service">
<Assembly FileName="ServiceWalkthrough.BusinessLogic\bin\Debug\ServiceWalkthrough.BusinessLogic.dll" />
<Category Name="Walkthrough" />
</Service>
<Debug AnalysisFileName="analysis.xml" />
<CodeGeneration>
<Logging Enabled="true" LoggerName="test.sb"/>
<Product Type="Interface" TargetDirectory="ServiceWalkthrough.Service.Interface">
<Param Name="Namespace" Value="ServiceWalkthrough.Service.Interface" />
</Product>
<Product Type="WebService" TargetDirectory="ServiceWalkthrough.Service.Web.Service">
<Param Name="SoapNamespace" Value="http://tempuri.org/" />
<Param Name="Namespace" Value="ServiceWalkthrough.Service.Web.Service" />
</Product>
<Product Type="DatabaseClient" TargetDirectory="ServiceWalkthrough.Service.DatabaseClient">
<Param Name="InterfaceNamespace" Value="ServiceWalkthrough.Service.Interface" />
<Param Name="Namespace" Value="ServiceWalkthrough.Service.DatabaseClient" />
</Product>
<Product Type="WebServiceClient" TargetDirectory="ServiceWalkthrough.Service.WebServiceClient">
<Param Name="InterfaceNamespace" Value="ServiceWalkthrough.Service.Interface" />
<Param Name="Namespace" Value="ServiceWalkthrough.Service.WebServiceClient" />
<Param Name="WebServiceProxyClass" Value="ServiceWalkthrough.Service.WebServiceClient.WalkthroughWebReference.WalkthroughServiceWebService" />
<Param Name="LoggingFramework" Value="log4net" />
</Product>
</CodeGeneration>
</ServiceBuilder>
In the Service element the modules (assemblies) and categories are listed
that define the method and parameter structure of the resulting service. In the
optional Debug element an output file can be specified that contains the result
of the analysis of the modules in a readable XML format. The CodeGeneration
elemnent contains all products (= sets of generated source code files). The Type
attribute specifies the kind of interoperability/adapter code to be generated.
The following diagram illustrates how the products are related to each other:
The Business Logic module(s) is/are the basis for the configured/generated service.
The (abstract) service client interface is generated from the Business Logic and does not
technically depend on any other module. Therefor, a user interface (Application GUI) or
an integration component can be implemented on top of this interface, independent from
the specific service connection technology.
If a Rich Client application is to be developed, the generated DatabaseClient component
is sufficient to implent the adapter layer between the service interface and the service
implementation. The DatabaseClient implements the interfaces generated in the Service.Interface
module and directly references the Business Logic module. This provides a complete
connection between GUI and service.
If the same application (GUI) should also be enabled to communicate with a server
that hosts the Business Logic over a HTTP/S Web Service interface, the generated
products WebService and WebServiceClient can be used to implement an alternative
technical service connection without changing the service implementation and the
Application GUI. The WebServiceClient implements the same interface as the DatabaseClient
and communicates with the generated WebService that is referencing the Business Logic
module. By separating the interoperability layer into two components that are generated together,
the physical distribution and network connection can be implemented in a way
that does not influence the logical service interface.
Development productivity
An important characteristic of the ice.NET Service Builder is that it can be
re-run with the same configuration anytime something in the service implementation
has changed. Therefore, once correctly configured, it always keeps all interfaces
and implementations of the interoperability layers up-to-date automatically and
without any further programming effort.
Therefore the Service Builder performs the repetitve and tedious tasks
that are associated with transferring changes in the business logic to
technical service connection components. It relieves the developer from
performing these maintenance tasks manually and reduces programming errors by
automatically and consistently regenerating the code based on stable
configurations and product templates.