Click here to Skip to main content
Click here to Skip to main content

Understanding Multilayered Architecture in .NET

, 30 Jun 2014 CPOL
Rate this:
Please Sign up or sign in to vote.
This article focussses on understanding a basic multilayered architecture in C#.

Introduction

This article focuses on understanding a basic multilayered architecture in C#. The article describes how we can achieve a simple basic multilayered architecture in .NET.

My efforts in this article are to focus on next level programming in .NET for developing an enterprise application.  

A Practical Approach

Let's start developing a simple multilayered architecture in .NET. I use C# as my programming language, however, the 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 and later it can be converted into a Windows Applications 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. Let's follow the implementation Step by Step,

Figure 2.

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.). Let's 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. Likewise 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 simple Student table with following fields, StudentId, Name, Email, Address, Age, Country. The Create script of the table is as follows:

Therefore, making studentid as primary key.

Step 4

Let's 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 achieve 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,

Figure 8

Do this for DAL and Common Layer as shown in Figure 8. After compiling 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 scenario. Suppose we need to get the details of all the students whose student IDs 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&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 students that have an 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 correspondingly throw an error if it is greater than 5, which we show at our default.aspx page by setting the message to error label text.BLL, which makes a 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.

Summary

In this article I discussed 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.

Please visit my blog A Practical Approach for more informative articles. 

Happy Coding Smile | :) .

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Akhil Mittal
Technical Lead
India India
I am a C# Corner MVP,a Code project MVP,author,blogger and currently working as an Analyst in an MNC and have an experience of more than 7 years in C#.Net. I am a B.Tech in Computer Science and hold a diploma in Information Security and Application Development. My work experience includes Development of Enterprise Applications using C#,.Net and Sql Server,Analysis as well as Research and Development. I am a MCP in Web Applications(MCTS-70-528,MCTS-70-515) and .Net Framework 2.0 (MCTS-70-536). Please visit my blog A Practical Approach for more informative articles.
____________________________________________________________________________________________________________________
 
Article of the Day on Microsoft's site http://www.asp.net/community/articles on 16 August 2013.
Article of the Day on Microsoft's site http://www.asp.net/community/articles on 28 August 2013.
Article of the Day on Microsoft's site http://www.asp.net/community/articles on 08 Sept 2013.
Article of the Day on Microsoft's site http://www.asp.net/community/articles on 29 Sept 2013.
Article of the Day on Microsoft's site http://www.asp.net/community/articles on 29 Oct 2013.
Article of the Day on Microsoft's site http://www.asp.net/community/articles on 21 May 2014.
Article of the Day on Microsoft's site http://www.asp.net/community/articles on 19 July 2014.
Member of the month for July 2013 on C# Corner
Month Winner for July 2013 on C# Corner
http://www.c-sharpcorner.com/News/3067/july-2013-month-winners-announced.aspx
Month Winner for May 2014 on C# Corner
http://www.c-sharpcorner.com/News/3798/may-2014-month-winners-announced.aspx
Group type: Collaborative Group

178 members

Follow on   Twitter   Google+   LinkedIn

Comments and Discussions

 
GeneralMy vote of 5 PinmemberMember 1019738312-Jul-14 3:50 
GeneralRe: My vote of 5 PinmvpAkhil Mittal13-Jul-14 18:55 
GeneralMy vote of 3 PinprofessionalCatchExAs9-Jul-14 5:30 
GeneralGreat article PinprofessionalVijay G. Yadav6-Jul-14 20:04 
GeneralRe: Great article PinmvpAkhil Mittal6-Jul-14 20:49 
GeneralMy vote of 5 PinmemberrediffAM5-Jul-14 5:42 
GeneralRe: My vote of 5 PinmvpAkhil Mittal6-Jul-14 0:52 
GeneralNice article Pinprofessionalsuhel_khan1-Jul-14 1:21 
GeneralRe: Nice article PinmvpAkhil Mittal1-Jul-14 1:22 
GeneralMy vote of 5 PinmemberChris Dis30-Jun-14 23:34 
GeneralRe: My vote of 5 PinmvpAkhil Mittal30-Jun-14 23:36 
GeneralMy vote of 5 PinmemberHumayun Kabir Mamun30-Jun-14 21:00 
GeneralRe: My vote of 5 PinmvpAkhil Mittal30-Jun-14 22:24 
GeneralMy vote of 5 Pinmembergpst29-Jun-14 22:23 
GeneralMy vote of 5 Pinmemberprashita gupta29-Jun-14 21:30 
GeneralRe: My vote of 5 PinmvpAkhil Mittal29-Jun-14 21:32 
GeneralMy vote of 3 PinprofessionalPaulo Zemek29-Jun-14 7:19 
GeneralRe: My vote of 3 PinmvpAkhil Mittal29-Jun-14 19:43 
GeneralMy vote of 4 Pinmembergpmsc27-Jun-14 7:52 
QuestionWhat is a multi-layered application? PinprofessionalPaulo Zemek27-Jun-14 7:09 
GeneralMy vote of 3 PinmemberMember 1003735027-Aug-13 8:27 
GeneralRe: My vote of 3 PinprofessionalPaulo Zemek27-Jun-14 6:55 
GeneralRe: My vote of 3 PinmvpAkhil Mittal27-Jun-14 7:04 
GeneralRe: My vote of 3 PinprofessionalPaulo Zemek27-Jun-14 7:11 
GeneralRe: My vote of 3 Pinmembergpmsc27-Jun-14 7:50 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.1411019.1 | Last Updated 1 Jul 2014
Article Copyright 2014 by Akhil Mittal
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid