Sunday, March 3, 2013

Contract First Development in WCF 4.5

WCF 4.5 supports contract first development. Means it allows to create all the data contract classes can be auto generated using the WSDL. one of the advantage in using the is if we start developing the service from the data contracts & then generating the WSDL we might end up in creating from data contracts with .net specific data types. But when using contract first development as WSDL is xml based only xml based data types are allowed to create so no .net specific contract will be created. This feature can be very useful when WSDL file is produced through design phase either by a solution architect or through mutual parties that agree on a contract prior to development and build phases.  When this is the case, either the contract can be created for a future service implementation or contracts can be created so that developers can begin coding for the client side of an interface prior to the endpoint being available.

The contract-first tool is integrated into Visual Studio 2012 as a build task. The code files generated by the build task are created every time the project is built, so that the project can easily adopt changes in the underlying service contract.

We’ll see step by step how we can create the data contracts using a WSDL file.

Step 1:

Create a WCF service library project.Add a sample WSDL file in to the project. This is a sample WSDL for a data contract named Product with some properties.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ServiceSchema"
targetNamespace="http://tempuri.org/ServiceSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/ServiceSchema.xsd"
xmlns:mstns="http://tempuri.org/ServiceSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="Product">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" default="2.2" />
<xs:element minOccurs="0" maxOccurs="1" name="Category" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Code" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Quantity" type="xs:double" />
<xs:element minOccurs="0" maxOccurs="1" name="Price" type="xs:double" />
<xs:element minOccurs="0" maxOccurs="1" name="Orders" type="xs:double" />
</xs:sequence>
</xs:complexType>
</xs:schema>

Step 2:


Contract-first options can be configured in the Properties menu of a WCF project. To enable contract-first development, select the Enable XSD as Type Definition Language check box in the WCF page of the project properties window.


image


You can set the advanced properties by clicking the advanced button & configure them in the advanced properties window.


 


image


Step 3:


After setting the properties build the project by pressing F6. Then the data contract will be available in the project.


image


 


Auto Generated code will be as follows. The file is created in the <project directory>/obj/<build configuration>/XSDGeneratedCode/ directory by default.


//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.17929
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ContractFirstDemo.ContractTypes
{
    using System.Xml.Serialization;
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("MSBuild", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd", IsNullable=true)]
    public partial class Product
    {
        private string nameField;
        private string categoryField;
        private string codeField;
        private double quantityField;
        private bool quantityFieldSpecified;
        private double priceField;
        private bool priceFieldSpecified;
        private double ordersField;
        private bool ordersFieldSpecified;
        public Product()
        {
            this.nameField = "2.2";
        }
        /// <remarks/>
        [System.ComponentModel.DefaultValueAttribute("2.2")]
        public string Name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }
        /// <remarks/>
        public string Category
        {
            get
            {
                return this.categoryField;
            }
            set
            {
                this.categoryField = value;
            }
        }
        /// <remarks/>
        public string Code
        {
            get
            {
                return this.codeField;
            }
            set
            {
                this.codeField = value;
            }
        }
        /// <remarks/>
        public double Quantity
        {
            get
            {
                return this.quantityField;
            }
            set
            {
                this.quantityField = value;
            }
        }
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool QuantitySpecified
        {
            get
            {
                return this.quantityFieldSpecified;
            }
            set
            {
                this.quantityFieldSpecified = value;
            }
        }
        /// <remarks/>
        public double Price
        {
            get
            {
                return this.priceField;
            }
            set
            {
                this.priceField = value;
            }
        }
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool PriceSpecified
        {
            get
            {
                return this.priceFieldSpecified;
            }
            set
            {
                this.priceFieldSpecified = value;
            }
        }
        /// <remarks/>
        public double Orders
        {
            get
            {
                return this.ordersField;
            }
            set
            {
                this.ordersField = value;
            }
        }
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool OrdersSpecified
        {
            get
            {
                return this.ordersFieldSpecified;
            }
            set
            {
                this.ordersFieldSpecified = value;
            }
        }
    }
}

Hope this gives you a starting point to start developing WCF with Contract first development. You can find some posts in the below URLS.



 


Happy Coding

4 comments :

  1. If we create dotnet specific data contracts in WCF, then what would be the mistake, eventually it will create WSDL in xml format only so that this will be used any technology, Here I dont find any wrong

    ReplyDelete
  2. Excellent ! I am truly impressed that there is so much about this subject that has been revealed and you did it so nicely. Dot Net Training in Chennai

    ReplyDelete