Sunday, 31 March 2013

Understanding Multilayered Architecture in .Net


     Introduction :

     This article focussses on understanding a basic multilayered architecture in C#.Net,
The article starts with introduction to one tier, two tier and n-tier architectures,their pros and cons,  and later describes how we can acheive a simple basic multilayered architecture in .Net.
My effort in this article would be to focus on next level programming in .Net for developing an enterprise application.

     Layered Architecture :

When the different components in a system are organized systematically we call it a system architecture. The architecture is the enterprise-scale division of a system into layers or tiers, each having responsibility for a major part of the system and with as little direct influence
on other layers.

One, two, three and n-tier applications :

There are plenty of ways where a system can be split into no. of  logical tiers.

  One-tier applications

Single-tier applications are basically simple standalone programs.
It's not necessary to take network communication and the risk of network failure
into consideration in these type of cases as they do not have the network access.
Since all the data resides within the same application,so these programs do not focus on synchronization of data. When separating the tiers physically the application get slower due to the  fact that communication over network will result in a loss of performance, therefore one-tier applications certainly have high performance.

Two-tier applications

A two-tier application, in comparison to the one-tier application as described, does not
combine all functions into a single process but separate different functions. For example
a chat application. This kind of application contains two separated tiers, client and a server.
The client has the responsibility of capturing user input and displaying the actual messages.
The server is responsible of the communication between the people that uses the chat client.

Three-tier applications

A three-tier application, adds another tier to the previous mentioned chat application, this
could be in the form of a database. One could think of a three-tier application as a dynamic
web application, which has a user interface, business logic,services and a database each placed in different tiers, as illustrated in Figure 1. As mentioned in the previous section a two-tier architecture   separates the user interface from the business logic, in the same way the three tier architecture separates the  database from the business logic.

N-tier applications

A logical n-tier application is an application where all logical parts are separated into discrete classes. In a typical business application, this generally involves a presentation layer, business logic layer and a data access layer. This separation makes the application easier to maintain. The advantages of this architecture are that all business rules are centralized which make them easy to create, use and re-use. The data access is also centralized, which has the same advantage as the centralization of the business rules. Centralizing the data access routines are also good when it comes to maintenance since changes only has to be implemented at one location. There are really not that many disadvantages of this kind of architecture, however, it
takes a bit longer to get up and running since several separate components has to be
developed, which also might make the code a bit more complicated to grasp for less
experienced developers.

A Practical Approach :

Lets start developing a simple multilayered architecture in .Net, I take c# as my programming language,however programming language is not a bar at all , one can choose the same as per comfort of programming.The architecture which we are to implement has the following design as mentioned in Figure 2.We will start creating the architecture for a web application , later it could be converted into a windows application too.
We will make use of class libraries to physically seperate our layers.There for one Web Application/Project, one Business logic layer class library , one Data access layer class library and one Common layer class library can be included in the solution.
Lets follow the implementation Step by Step,


Step 1 : Add a Web Project (Presentation layer).

             Open your Visual Studio and add a simple website to the solution, name it Presentation Layer.



Your Development Environment may look like,


Our Presentation Layer is the Web application, that will be exposed to the end user,
The Web application includes Web Forms i.e. aspx pages, User Controls i.e. Ascx pages,
Scrips (client side java scripts),Styles (css and custom styles for styling the page),Master Page(.master extension, for providing common functionality to group of desired pages,Configuration Files like web.config and app.config etc.).
Lets setup our next projects and define them in seperate layers, Add three folders to your solution,Folders named, BusinessLogicLayer, DataAccessLayer and CommonLayer.Your solution will look like as below,



   Step 2 : Add a Business Logic layer, Data Access Layer and Common Layer :

                Right click the Business Logic Layer folder and add a c# class library project to it, call it BLL.csproj,


  Doing this will ad a c# class library project to our solution in the Businee Logic Layer Folder.

  Like wise add two more projects to Common Layer and DataAccessLayer folder respectively and call them Common.csproj and DAL.csproj projects.

  The Data Access Layer Project Contains the entities classes and objects to communicate with database, where as our common project contains properties, helper classes to communicate with all the three layers commonly.It contains the objects to be passed to and fro from presentation layer to data access layer commonly, and also acts as a mode of message passing between the layers.

   Now our solution would look like as below,



Step 3 : Create a database with a sample table and put some default values in it, for example i have created a database named “EkuBase” and created a siple Student table with following fields, StudentId,Name,Email,Address,Age,Country.The Create script of the table is as follows,
      USE [EkuBase]
GO

/****** Object:  Table [dbo].[Student]    Script Date: 12/24/2011 14:53:14 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Student](
   [StudentID] [int] NOT NULL,
   [Name] [nvarchar](50) NULL,
   [Email] [nvarchar](50) NULL,
   [Address] [nvarchar](50) NULL,
   [Age] [int] NULL,
   [Country] [nvarchar](50) NULL,
 CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
(
   [StudentID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
     Therefore making studentid as primary key.

   Step 4: Lets add classes to our projetcs,Add StudentBLL.cs,StudentDAL.cs,StudentEntity.cs to BLL,DAl and Common Layer respectively,make sure you qualify them with logical namespaces,so that its easy to recognize and use them.

      BLL:            
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLL
{
    public class StudentBLL
    {
    }
}

     DAL:                
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public class StudentDAL
    {
    }
}

  Common:        

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Common
{
    public class StudentEntity
    {
    }
}

  Step 5: Add Connection String in web.config and a Helper class to DAL to interact with DataBase,In my case i am using SQL helper for ease.
         
  Web.Config :
                <connectionStrings>
<add name="Connections" connectionString="Data Source=69B5ZR1\SQLEXPRESS;Initial Catalog=EkuBase;Persist Security Info=True;User ID=akhil;Password=akhil" providerName="System.Data.SqlClient"/>
                </connectionStrings>

  and define the Connection String in your Sql Helper so that you dnt have to again and again create a connection and pass it to your method when you interact with database.

            public static readonly string CONN_STRING = ConfigurationManager.ConnectionStrings["Connections"].ConnectionString;

        add reference of System.Configuration to DAL project before reading the above connection string.

    Step 6: Configure the solution and add dll's to dependent layers,

            Since we need to seperate the business logic,presentation and data access,and we do not want presentation layer to directly interact with database nor the business logic,we add reference of business logic layer to our presentation layer and data access layer to the business logic layer and common layer to all the three layers,To acheive the same add a commonn DLL folder to the physical location of the Solution and give build path of all the three class projects to that DLL folder,doing this we can directly get access to DLL's of all the layers to the layers needed that DLL.We'll get the dll's in that folder once we complite our project,   








Do this for DAL and Common Layer as shown in Figure 8.Aftre compling all the projects we get dll's in DLL folder created.



Now add reference of Common.dll,BLL.dll to Presentation Layer, Common.dll,DAL.dll to BLL Layer,
Common.dll to DAL layer and compile your solution.
Now the code of BLL is accessible to Presentation Layer,and DAL is accessible to BLL, and Common is accessible to all three layers.

Step 7: Write methods to get the flow.

             Now we need to write some code to our layers to get the feel of flow between all the layers, Let's create a scenarion, Suppose we need to get the details of all the students whose student id is less than 5.For that add some sample data to your Student table,about 7 rows would work(Figure 11),and add a gridview to Default.aspx in presentation layer to show the data.


                                                             Figure 11
           
Default.aspx:

        <%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Welcome to ASP.NET!
    </h2>
    <p>
        To learn more about ASP.NET visit <a href="http://www.asp.net" title="ASP.NET Website">www.asp.net</a>.
    </p>
    <p>
        You can also find <a href="http://go.microsoft.com/fwlink/?LinkID=152368&amp;clcid=0x409"
            title="MSDN ASP.NET Docs">documentation on ASP.NET at MSDN</a>.
    </p>

    <div>
    <asp:GridView runat ="server" ID="grdStudent"></asp:GridView>
    </div>
    <div>
                   <asp:Label runat="server" ID="lblError" Font-Bold=true ForeColor=red ></asp:Label>
                  </div>
   
</asp:Content>

Now decorate your StudentEntity Class in Common layer with following code, to make properties for each column we are going to access from Student table,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Common
{
    public class StudentEntity
    {
        int studentID;

        public int StudentID
        {
            get { return studentID; }
            set { studentID = value; }
        }
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        string email;

        public string Email
        {
            get { return email; }
            set { email = value; }
        }
        string address;

        public string Address
        {
            get { return address; }
            set { address = value; }
        }
        int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        string country;

        public string Country
        {
            get { return country; }
            set { country = value; }
        }
    }
}


and StudentDAL with following code to call the data from database,We always write data interaction code in this layer only,making it as a protocol.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace DAL
{
    public class StudentDAL
    {
        public DataSet FetchSelectedStudents()
        {
            string sqlCommand = "select * from Student where Studentid<5";
            DataSet dataSet = SqlHelper.ExecuteDataset(SqlHelper.CONN_STRING, CommandType.Text, sqlCommand);
            return dataSet;
        }

    }
}

  Here we simply make a call to database to get studutents having id less than 5.

   We write following code to BLL class,where we perform validation check for the id whether it is less or greater that 5, and correspondigly throw error is its greater than 5,which we show at our default.aspx page by setting the message to error label text.BLL makes call to DAL to fetch the students,and passes to Presentation Layer, where data is shown in GridView.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using Common;

namespace BLL
{
    public class StudentBLL
    {
        public DataTable GetStudentBelow5(StudentEntity student)
        {
            StudentDAL studentDAL = new StudentDAL();
            if (ValidateID(student.StudentID))
            {
                return studentDAL.FetchSelectedStudents().Tables[0];
            }
            return null;

        }

        private bool ValidateID(int studentID)
        {
            if (studentID > 5)
            {
                throw new ApplicationException("Id Should be less than 5");
            }
            return true;
        }
    }
}

  and in Presentation layer we write code to bind our gridview else show error message in case of error returned from BLL.

  Default.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using BLL;
using Common;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        StudentBLL studentBLL = new StudentBLL();
        StudentEntity studentEntity=new StudentEntity();
        studentEntity.StudentID=6;
        DataTable dTable = new DataTable();
        try
        {
            dTable = studentBLL.GetStudentBelow5(studentEntity);
            grdStudent.DataSource = dTable;
            grdStudent.DataBind();
        }
        catch (ApplicationException applicationException)
        {
            lblError.Text = applicationException.Message;
        }
    }
}

  In the above code we specify student id as 6 in Student Entity and pass it to BLL,when we run the code we get the following page with our error label set with the error message,


It clearly states that id should be less than 5.Note that we do not get to DAL before the data is validated.
Now change the student id to 5 and see the result,We get the following page,


Thus we get the clear result.
Here we have seen how we communicated through different layers performing different roles to fetch the data.

General advantages of layered applications:

There are various advantages of developing applications that are split up into different tiers or
layers. Most importantly this form of architecture helps to enforce the principles of high
cohesion within system components and low coupling between different components. A
system built on these principles will be more robust, easier to adjust, easier to maintain and
understand and it allows different software components to be developed in parallel.
The key point is that a system should be split into different smaller parts that are as
cohesive and self-governing as possible. Each part has distinct responsibilities and interacts
with other parts of the system to accomplish its tasks and responsibilities. This also ensures
that the systems can corporate across different platforms and communication protocols and
makes it easier to reuse existing solutions to problems often encountered.
All in all these advantages are desirable because they work in the direction of low
coupling and high cohesion. The hard part is, however, to implement this in practice and to
know when and how it should be implemented. What objects should have responsibility for
the different tasks and how do they interact.

Summary :

In this article I discussed about what are layered applications,different types of layered applications and how to create a multilayered application in .Net.We can handle the Exceptions more intelligently at DAL and BLL,however that was not the scope of the article so that part is skipped and i'll surely discuss this in my forthcoming articles.The article was a focus on development for beginners, who face challenges to create an architecture before starting development.Happy Coding :-) .


Read more:

Other Series

My other series of articles:

For more technical articles you can reach out to CodeTeddy.


Share/Bookmark