Contract Inheritance
Service contract interfaces can derive from each other, enabling you to define a
hierarchy of contracts. However, the ServiceContract
attribute is not inheritable:
[AttributeUsage(Inherited = false,...)]
public sealed class ServiceContractAttribute : Attribute
{...}Consequently, every level in the interface hierarchy must explicitly have the ServiceContract attribute, as shown in Example 2-3.
Example 2-3. Service-side contract hierarchy
[ServiceContract]
interface ISimpleCalculator
{
[OperationContract]
int Add(int arg1,int arg2);
}
[ServiceContract]
interface IScientificCalculator : ISimpleCalculator
{
[OperationContract]
int Multiply(int arg1,int arg2);
}When it comes to implementing a contract hierarchy, a single service class can implement the entire hierarchy, just as with classic C# programming:
class MyCalculator : IScientificCalculator
{
public int Add(int arg1,int arg2)
{
return arg1 + arg2;
}
public int Multiply(int arg1,int arg2)
{
return arg1 * arg2;
}
}The host can expose a single endpoint for the bottommost interface in the hierarchy:
<service name = "MyCalculator">
<endpoint
address = "http://localhost:8001/MyCalculator/"
binding = "basicHttpBinding"
contract = "IScientificCalculator"
/>
</service>Client-Side Contract Hierarchy
When a client imports the metadata of a service endpoint whose contract is part of an interface hierarchy, the resulting contract on the client side will not maintain the original hierarchy. Instead, it will include a flattened ...