June 13, 2011

REST based web services and it's implementation using .net technology

Introduction:
   REST (REpresentational State Transfer) is an architectural approach to design web services that are accessed using HTTP requests and verbs. It applies the architecture of the web to web service. In REST each resource is treated as a distinct resource and provides the functionality for bookmarking , caching etc. Depending on the use of HTTP verbs (GET, POST, DELETE, PUT) REST is divided into two types i.e. HI-REST and LO-REST.
    In HI-REST it uses the verbs (GET, POST, DELETE, PUT) for a particular operations as the following way
    GET : to fetch resource from server
    POST: append to the resource
    PUT:insert and update the resource
    DELETE: to delete the resource
But in the case of LO-REST POST verb is used for insert, update, delete and fetch of the resource.

Implementation:
    Microsoft .net framework introduces a binding called webHttpBinding in Windows Communication Foundation(WCF) for creating and consuming REST based web services. To create a REST based web service we have to follow the below processes.
  • We have to decorate the operation contracts we have defined in our service interface either with WebGet or WebInvoke attribute to make it REST enable (to access this attribute we have to reference System.ServiceModel.Web namespace)
  • Set the binding of endpoint to webHttpBinding in the configuration file.
  • Add a behavior under the endPointBehaviors element that has a webHttp child element
  • Add a behavior configuration to your endpoint that references the endpoint behavior.
When we are using the WebGet attribute the method to access the service method is GET. So we can access it from any browser using the URL like http://localhost/RESTTest/ClientService.svc/Clients/

But when we use the WebInvoke attribute to decorate our operation contract to make it REST enable we have to specify the method of accessing it (i.e. GET, POST, PUT, DELETE). 


Example of Service Interface :
[ServiceContract]
    public interface IProcess
    {
        [OperationContract, WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, Method = "GET",
             RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "Client/{clientID}")]
         ClientBO Process(string clientID);

         [OperationContract, WebGet(BodyStyle = WebMessageBodyStyle.Bare,
              RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "Clients/")]
          IEnumerable<ClientBO> Process1();

          [OperationContract, WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, Method = "POST",
               ResponseFormat = WebMessageFormat.Xml, UriTemplate = "AddClient/")]
           bool AddClient(Stream client);
    }
Configuration File Setting:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>
        <services>
            <service name="RepPoC.RESTService.Process">
                <endpoint address="" binding="webHttpBinding" contract="RepPoC.RESTService.IProcess"
            behaviorConfiguration ="WebBehavior" />
            </service>
        </services>
        <behaviors>
            <endpointBehaviors>
                <behavior name="WebBehavior">
                    <webHttp />
                </behavior>
            </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Code to Call REST Service:
//GetSerializedData basically takes your object as parameter and serialize it and return the byte array. We need to pass it
//with request
Byte[] postData = GetSerializedData(client);
WebRequest request = WebRequest.Create(new Uri("http://localhost/RESTService/Process.svc/AddClient/"));
request.Method = "POST";
request.ContentLength = postData.Length;
request.ContentType = "text/plain";
Stream postStream ;
postStream = request.GetRequestStream();
postStream.Write(postData, 0, postData.Length );
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
Response.Write(reader.ReadToEnd());


 Advantages of REST:
  •  Provides improved response time and reduces server load due to it's support of caching 
  • Improves server scalability by reducing the need of maintaining session state
  • Does not require a separate resource discovery mechanism , due to the use of hyperlink in representation
  • Network admin can easyly understand what operation is going on the server by looking the URLs
  • Easier to use compared to SOAP based services.
  • Lightweight - Output are in plain XML, not extra markup in output like SOAP
Drawbacks:
  • REST is certainly not a replacement for Web services, as it doesn’t provide the     
    breadth of features like security, quality of service, transactions, queuing etc.
  • Doesn't provide any metadata. The user has implicitly know what a service requires.

May 04, 2011

MVVM design pattern implementation using Silverlight

Introduction:
This article is mainly as per my understanding about the MVVM pattern, and may be I am not correct at every point, So your input are greatly appreciated. After reading few articles on the net I just try to explain this pattern with a simple example in silver light 4 (using visual studio 2010).

Description:
MVVM stands for Model-View-VewModel. It is based on the  MVC design pattern and targeted at modern User Interface development platforms like WPF and Silverlight and helps us building a true application that is more readable, easily testable, re-usable and maintainable. 
One of the main goal of the MVVM pattern is to create an application that is loosely coupled. MVVM pattern mainly built of using three components View, ViewModel and Model.


MVVM Pattern (in this diagram i have included service that is used to communicate with web service/database to fetch data.)




View:
These are the Silverlight/WPF screens and does not contains any code behind. Views in MVVM pattern communicate in the application based on the bindings and commands that are contained in the ViewModel.


Model:
This part holds the data entities, business logic and it is completely independent of the View.


ViewModel:
 This component is responsible for exposing the data objects from the model in such a way that these objects are easily managed and consumes by the view. It acts like a value converter, which converts the raw data from the the Model and make it View friendly and vice-versa. Along with providing data for the Views it also  contains the commands the View can use for interaction in the application.


Note: The key thing of ViewModel is that you have one and only one ViewModel per View.


How it works?:
The ViewModel is typically contains the properties/Collections for the data that is going to be shown by the View. These properties/Collections raises notifications when the data changes. So when the data changes the View can receive the notification to update itself. The View Uses the powerful data binding features provided by the Silverlight/WPF to bind these properties exposed by the ViewModel with the controls that the view is composed of. User events that are captured by the view are sent to the ViewModel by the commands properties, and these commands executes a method in the ViewModel, which in result either sent a request to the Model to process some business logic  or update its own properties so that the View can update automatically.


Why to use MVVM Pattern?:
  • It allows a developer to create an application with no user interface.
  • A designer able to create User Interface without writing a single line of code.
  • As the UI is loosely coupled, It can be changed without changing any code.
Implementation MVVM Pattern using Silverlight:
    Here i am showing a simple example in Silverlight that implements the MVVM pattern. In this example I provide the searching on the employee based on name. So in my screen there are three controls one text box that is used to enter the search text and a button that will do the search operation and a grid to show the result employee list. But in this example i am not using the text box data for searching and just showing some hard coded data, because my purpose here to show the MVVM Pattern implementation.
Silverlight Application

Model Implementation:
    In this example I have used the model as a data entity. Here i have created a base class for model that implements the INotifyPropertyChanged and IDisposable interface. INotifyPropertyChanged Interface is used to notify the view that the property is changed and it have to update itself and the IDisposable interface to provide the dispose functionality to my class.

Model base class code:
public class BaseModel: INotifyPropertyChanged, IDisposable
    {
        #region IDisposable Members
        public void Dispose()
        {
            this.OnDispose();
        }
        public virtual void OnDispose()
        {

        }
        #endregion

        #region INotifyPropertyChanged Members
        /// <summary>
        /// This event is used to notify differnet silverlight binding that the data in changed for one
        /// or more properties so that control can be updated automatically.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// This method is used to raise the PropertyChanged event.
        /// </summary>
        /// <param name="propertyName"></param>
        protected void OnNotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
Model Code:

public class EmployeeModel : BaseModel
    {
        #region [Properties]
        private string firstName;
        public string FirstName
        {
            get
            {
                return firstName;
            }
            set
            {
                firstName = value;
                OnNotifyPropertyChanged("FirstName");
            }
        }

        private string lastName;
        public string LastName
        {
            get
            {
                return lastName;
            }
            set
            {
                lastName = value;
                OnNotifyPropertyChanged("LastName");
            }
        }

        private Int32 age;
        public Int32 Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
                OnNotifyPropertyChanged("Age");
            }
        }
        #endregion
       
        #region [Constructors]
        public EmployeeModel(string fName, string lName, Int32 age)
        {
            FirstName = fName;
            LastName = lName;
            Age = age;
        }
        #endregion
    }
Service Implementation:
Service class is used here for communication with the data source or the web service/REST service to retrieve data and set/update the model. In this example i am not using any code for data access or calling any web service. For display purpose i have fixed some data that i can show in this example. You can change this code and try your own.

Employee service interface code:

  public interface IEmpService
    {
        ObservableCollection<EmployeeModel> GetEmployees(string name);
    }
Employee Service Code:

public class EmpService : IEmpService
    {
        #region IEmpService Members
        public System.Collections.ObjectModel.ObservableCollection<Model.EmployeeModel> GetEmployees(string name)
        {
            ObservableCollection<EmployeeModel> empList = new ObservableCollection<EmployeeModel>();

            empList.Add(new EmployeeModel("Prasant", "Swain", 99));
            empList.Add(new EmployeeModel("Prakash", "Samal", 99));

            return empList;
        }
        #endregion
    }

ViewModel Implementation:
Like the implementation of Model here also we have created a base class for all the ViewModel class. It implements the INotifyPropertyChanged interface to provide the functionality to notify the bindings of the View to update itself when any property changes along with this we have defined another class called ProcessCommand that implements the ICommand interface. This class is basically used to bind the events in the View with the ViewModel.


BaseModel Class Code:
public abstract class BaseViewModel:INotifyPropertyChanged
    {
        /// <summary>
        /// This event is used to notify differnet silverlight binding that the data in changed for one
        /// or more properties so that control can be updated automatically.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// This method is used to raise the PropertyChanged event.
        /// </summary>
        /// <param name="propertyName"></param>
        protected void OnNotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public bool IsDesignTime
        {
            get
            {
                return DesignerProperties.IsInDesignTool;
                //return (Application.Current == null) || (Application.Current.GetType() == typeof(Application));
            }
        }
    }

ProcessCommand Class Code:
    public class ProcessCommand : ICommand
    {
        #region ICommand Members
        Func<object, bool> canExecute;
        Action<object> execute;
        bool canExecuteFlag;

        public ProcessCommand(Action<object> executeAction)
        {
            this.execute = executeAction;
            this.canExecute = (p) => { return true; };
        }

        public ProcessCommand(Action<object> executeAction, Func<object, bool> canExecute)
        {
            this.canExecute = canExecute;
            this.execute = executeAction;
        }
       
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        {
            bool tempCanExecute = canExecute(parameter);
            if (this.canExecuteFlag != tempCanExecute)
            {
                this.canExecuteFlag = tempCanExecute;
                if (CanExecuteChanged != null)
                {
                    CanExecuteChanged(this, new EventArgs());
                }
            }
            return tempCanExecute;
        }

        public void Execute(object parameter)
        {
            execute(parameter);
        }
        #endregion
    }
EmployeeViewModel Code:
  public class EmployeeViewModel:BaseViewModel
    {
        #region [Properties]
        private ObservableCollection<EmployeeModel> employees;
        public ObservableCollection<EmployeeModel> Employees
        {
            get
            {
                return employees;
            }
            set
            {
                employees = value;
                OnNotifyPropertyChanged("Employees");
            }
        }

        private EmployeeModel currentEmployee;
        public EmployeeModel CurrentEmployee
        {
            get { return currentEmployee; }
            set
            {
                    currentEmployee = value;
                    OnNotifyPropertyChanged("CurrentEmployee");
            }
        }

        private string searchName;
        public string SearchName
        {
            get
            {
                return searchName;
            }
            set
            {
                if (searchName != value)
                {
                    searchName = value;
                    OnNotifyPropertyChanged("SearchName");
                }
            }
        }

        public ICommand SearchCmd
        {
            get {return new ProcessCommand(SearchCommand, (e) => { return true; });}
        }
        #endregion

        #region [Methods]
        public void SearchCommand(object objParam)
        {
            IEmpService empService = new EmpService();
            Employees = (ObservableCollection<EmployeeModel>)empService.GetEmployees(SearchName);

            CurrentEmployee = employees[0];
        }
        #endregion
    }
View Implementation:
As described above in my view i have used three controls for this example a text box (not using it in this example), a button and a data grid. button is bind with the SearchCmd property and the data grid is bind with the employee list (Employees) which is implemented as a Observable collection.
View Code:
<UserControl x:Class="MVVMPoC.App.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ViewModel="clr-namespace:MVVMPoC.ViewModel;assembly=MVVMPoC.ViewModel"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:my="clr-namespace:MVVMPoC.App.Controls" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    <UserControl.Resources>
        <ViewModel:EmployeeViewModel x:Key="empVM"/>
    </UserControl.Resources>

        <Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource empVM}}" Height="247" Width="400">
        <TextBox Height="23" HorizontalAlignment="Left" Margin="42,25,0,0" Name="textBox1" VerticalAlignment="Top" Width="129" DataContext="{Binding Path=SearchCmd, Mode=TwoWay}" />
        <Button Content="Search" Height="23" HorizontalAlignment="Left" Margin="177,25,0,0" Name="button1" VerticalAlignment="Top" Width="75" Command="{Binding Path=SearchCmd}" />
        <sdk:DataGrid AutoGenerateColumns="True" Height="140" HorizontalAlignment="Left" Margin="42,54,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="338" ItemsSource="{Binding Path=Employees, Mode=TwoWay}" />
    </Grid>
</UserControl> 

April 29, 2011

Dispose Vs Finalize

Dispose method is mainly controlled by the developer, and it frees all the resource upon the completion of the event. While Finalize method is controlled by the Garbage Collector(GC) and there is no predictability as to when the GC will call the finalize method to free the resources.


Finalize method cannot be overridden or called explicitly. It is basically used for implicit resource clean-up.


C# provides a USING statement , which ensures that Dispose() method will be called at the earliest possible time (Dispose method is automatically called if the class implements IDisposable and used in USING statement).



April 25, 2011

IDisposable Interface (Disposable Pattern)


Introduction:
    IDisposable Interface is primarily designed to provide a standard way to manage the unmanged resources in the .net applications.
  
Description:
    We know that Garbage Collector(GC) is designed to manage memory allocation in .net applications. So developer have no headache to manage the managed resources as GC manage it implicitly. But when it comes about the unmanaged resources GC have no control over it, because GC is not designed to deal with unmanaged resources, so it is the developers responsibility to manage this unmanaged resources.
   A developer can achieve this by overriding the Finalize method, but the problem with finalize method is that as Garbage Collector does not run in deterministically and in result the object may be wait for finalization for a longer period of time. And this situation becomes more complected if our object is using expensive resources like database connection or file handles, then waiting a long period of time to free these resource is not acceptable. To avoid this waiting of Garbage Collection for an indeterminate amount of time to free resource Disposable Pattern (IDisposable pattern) is used.
      
This Disposable Pattern/IDisposable Interface is basically designed to ensure predictable and reliable cleanup of resource to prevent resource leak and to provide a standard pattern for disposable classes. IDisposable interface defines a single method called Dispose() that need to be implemented by the implemented class. And the developers have to ensure that they implements clean up code using this method.

Example:

   public class MyDisposableClass : IDisposable
    {
        private bool isDisposted = false;

        ~MyDisposableClass()
        {
            Dispose(false);
        }

        public void Dispose()
        {
            Dispose(true);
        }

        private void Dispose(bool disposing)
        {
            if (!isDisposted)
            {
                if (disposing)
                {
                    //TODO: Wtire your clean up code here
                   
                    //This will remove the object from the finalization queue as the clean up
                    //is already done and finaliztion is not required.
                    GC.SuppressFinalize(this);

                }
                // flag set to ture as dispose is done
                isDisposted = true;
            }
        }
    }



April 21, 2011

HTTP Modules Vs Global.asax File

Differences:
    If you view the functionality provided by the HTTP Modules and the Global.asax file you find both are almost similar, But the advantage of using the HTTP Module over Global.aspx file is that they can be re-used by adding them to the GAC (Global Assembly Cache) and registering in the Machine.config file you can use it across all the application running on that server, while global.asax files are application specific.

   And the advantage of using Global.asax file over HTTP Modules is that it provides some extra events that can not be available during  in the HTTP Module implementation. Those events are :
                            1. Application_start
                            2. Session_Start
                            3. Session_End
                            4. Application_End
Along with this Global.asax also enables you to declare and initialize your global objects in your application. 

Another difference is that you can have one Global.asax file in your application and you have to implement all your required logic on that, But in the case of HTTP Module you can divide your required logic in different modules and can have more than one HTTP Module attached in your application.