Creating ASP.
NET Applications with N-Tier Architecture - CodeProject
1 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
Sign up for our free weekly Web Developer Newsletter.
home
articles
quick answers
discussions
features
community
Search for articles, questions, tips
help
Articles Web Development ASP.NET General
Prev Next
Stats
Creating ASP.NET Applications with N-Tier
Architecture
Revisions (5)
By Rahul Rajat Singh, 20 Aug 2012
Article
Browse Code
Alternatives
Comments &
Discussions (48)
4.76 (33 votes)
Download demo - 760.7 KB
Introduction
This article describes how to build ASP.NET applications using n-tier architecture. The benefits of
having n-tier architecture is that all the modules having dedicated functionality will be
independent of each other. Changing one tier will not effect other tiers and there is no single
point of failure even if some tier is not working.
Background
About Article
This article describes how
to build ASP.NET
applications using n-tier
architecture.
Type
Article
Licence
CPOL
First Posted
13 Aug 2012
Views
48,115
Downloads
4,845
Bookmarked
79 times
C# ASP.NET Beginner
N-Tier
In a typical n-tier application there will be 4 Layers. The bottom most layer is the Data layer which
contains the tables and stored procedures, scaler function, table values function. This Data layer
is typically the database engine itself. We will be using SqlServer as the data layer in our
example.
On top of Data Layer, we have a Data Access Layer (DAL). This layer is responsible for handling
Database related tasks i.e. only data access. This Data access layer is created as a separate
solution so that the changes in DAL only need the recompilation of DAL and not the complete
website. The benefit of having this layer as a separate solution is that in case the database engine
is changes we only need to change the DAL and the other areas of the website need not be
changed and recompiled. Also the changes in other areas outside this solution will not demand
for DAL recompilation.
On top of DAL, we have our Business Logic Layer(BLL). BLL contains all the calculations
and Business Rule validations that are required in the application. It is also in a separate solution
for the reason that if the Business rules change or the calculations change we only need to
recompile the BLL and the other layers of the application will remain unaffected.
Finally on top of BLL we have our Presentation Layer. The Presentation layer for an ASP.NET web
forms application is all the Forms (apsx pages and their code behinds) and the classes
contained in the App_Code folder. The Presentation layer is responsible for taking the user input,
showing the data to the user and mainly performing input data validation.
Note: Input data filtration and validation is typically done at the Presentation Layer(Both client
side and server side). The business Rule validation will be done at the BLL.
So to visualize the above mentioned architecture:
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
2 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
Top News
How Newegg crushed the
shopping cart patent and
saved online retail
Get the Insider News free each
morning.
Related Articles
N-Tier Architecture and Tips
Walkthrough: Creating an
N-tier Data Application with a
ASP.NET Presentation Tier
A N-Tier Architecture Sample
with ASP.NET MVC3, WCF, and
Entity Framework
Note: The Data Access Layer in this article was written using classic ADO.NET, due to which the
amount of code in DAL is little too much. Nowadays using ORMs like Entity framework to
generate the DAL is recommended. The DAL code will be generated by ORM itself.
Using the code
Let us develop a small Toy ASP.NET application that will use n-tier architecture. We will develop
a small Employee Management application for the NorthWind Database. (For simplicity, I have
removed all other tables from the DB and some columns from the Employee table). This
application should be able to perform the basic CRUD operations on the DB.
The solution for this application will contain separate projects for DAL and BLL. The Data Layer
will be SqlServer. The Presentation Layer is an ASP.NET website running on top of these
projects.
Architecture Guide: ASP.NET
MVC Framework + N-tier +
Entity Framework and Many
More
Back to the Basics: Exception
Management Design Guideline
for N-tier ASP.NET Applications
N-Tier application using
Managed C++ and ASP.NET - A
Tutorial
Open Source Extensible
Enterprise n-tier Application
Framework with Multilayered
Architecture
Using LINQ to SQL in N-Tier
Architectures
Implementing a CLR Stored
Procedure in a LINQ based
n-tier architecture
A Tool to create N-Layer
Architecture Classes
N-Tier: Begginer's guide in
designing their application
Fast, Flexible and Easy to Use
N-tier Software Architecture
ASP.NET Internals: Request
Architecture
N-Tier development with
ASP.NET MVC, WCF, and LINQ
Zombie Explorer : A N-Tier
application from top to bottom
Creating Scalable Architecture
Building an N-Tier Application
in VB.NET, in 8 Steps
The Data Layer
The data layer in this example contain only one table called Employee. The data layer also
contains the stored procedures for all the basic operations on the Employee table. So let us look
at the table and all the stored Procedures we have in our Data Layer.
Creating a WIX Installer for
ASP.NET Web Applications
Enterprise Application
Architecture with LINQ to SQL
Application architecture
research
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
3 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
Now we will create a set of stored procedures to perform the operations on the Employees Table.
Collapse | Copy Code
--1. Procedure to add a new employee
CREATE PROCEDURE dbo.AddNewEmployee
(
nvarchar(20),
@LastName
@FirstName
nvarchar(10),
@Title
nvarchar(30),
@Address
nvarchar(60),
@City
nvarchar(15),
@Region
nvarchar(15),
nvarchar(10),
@PostalCode
@Country
nvarchar(15),
@Extension
nvarchar(4)
)
AS
insert into Employees
(LastName, FirstName, Title, Address, City, Region, PostalCode, Country,
Extension)
values
(@LastName, @FirstName, @Title, @Address, @City, @Region, @PostalCode,
@Country, @Extension)
RETURN
--2. Procedure to delete an employee
CREATE PROCEDURE dbo.DeleteEmployee
(
@empId int
)
AS
delete from Employees where EmployeeID = @empId
RETURN
--3. Procedure to add get an employee details
CREATE PROCEDURE dbo.GetEmployeeDetails
(
@empId int
)
AS
Select * from Employees where EmployeeID = @empId
RETURN
--4. Procedure to get all the employees in the table
CREATE PROCEDURE dbo.GetEmployeeList
AS
Select * from Employees
RETURN
--5. Procedure to update an employee details
CREATE PROCEDURE dbo.UpdateEmployee
(
int,
@EmployeeID
@LastName
nvarchar(20),
@FirstName
nvarchar(10),
@Title
nvarchar(30),
@Address
nvarchar(60),
@City
nvarchar(15),
@Region
nvarchar(15),
@PostalCode
nvarchar(10),
nvarchar(15),
@Country
@Extension
nvarchar(4)
)
AS
update Employees
set
LastName = @LastName,
FirstName = @FirstName,
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
4 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
Title = @Title,
Address = @Address,
City = @City,
Region = @Region,
PostalCode = @PostalCode,
Country = @Country,
Extension = @Extension
where
EmployeeID = @EmployeeID
RETURN
Now we have our Data Layer ready.
The Data Access Layer
Now we will go ahead and create a Data Access Layer for our application. The data access layer
will contain 2 main type of classes. A set of classes that will represent the Table entities. And
classes to perform the CRUD operations on the database.
The Employee class in the above diagram is the Entity that will represent the Employee table.
This class has been created so that the Layers above the DAL will use this class to perform
operations in Employee table and they need not worry about the table schema related details.
Collapse | Copy Code
public class Employee
{
int employeeID;
string lastName;
string firstName;
string title;
string address;
string city;
string region;
string postalCode;
string country;
string extension;
//
//
//
//
//
//
//
//
//
should
should
should
should
should
should
should
should
should
be
be
be
be
be
be
be
be
be
(20)
(10)
(30)
(60)
(15)
(15)
(10)
(15)
(4)
chars
chars
chars
chars
chars
chars
chars
chars
chars
only
only
only
only
only
only
only
only
only
public int EmployeeID
{
get
{
return employeeID;
}
set
{
employeeID = value;
}
}
public string LastName
{
get
{
return lastName;
}
set
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
5 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
{
lastName
= value;
}
}
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value;
}
}
public string Title
{
get
{
return title;
}
set
{
title = value;
}
}
public string Address
{
get
{
return address;
}
set
{
address = value;
}
}
public string City
{
get
{
return city;
}
set
{
city = value;
}
}
public string Region
{
get
{
return region;
}
set
{
region = value;
}
}
public string PostalCode
{
get
{
return postalCode;
}
set
{
postalCode = value;
}
}
public string Country
{
get
{
return country;
}
set
{
country = value;
}
}
public string Extension
{
get
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
6 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
{
return extension;
}
set
{
extension = value;
}
}
}
The EmployeeDBAccess class expose the methods to perform the CRUD operations on the
Employee table.
Collapse | Copy Code
public class EmployeeDBAccess
{
public bool AddNewEmployee(Employee employee)
{
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@LastName", employee.LastName),
new SqlParameter("@FirstName", employee.FirstName),
new SqlParameter("@Title", employee.Title),
new SqlParameter("@Address", employee.Address),
new SqlParameter("@City", employee.City),
new SqlParameter("@Region", employee.Region),
new SqlParameter("@PostalCode", employee.PostalCode),
new SqlParameter("@Country", employee.Country),
new SqlParameter("@Extension", employee.Extension)
};
return SqlDBHelper.ExecuteNonQuery("AddNewEmployee",
CommandType.StoredProcedure, parameters);
}
public bool UpdateEmployee(Employee employee)
{
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@EmployeeID", employee.EmployeeID),
new SqlParameter("@LastName", employee.LastName),
new SqlParameter("@FirstName", employee.FirstName),
new SqlParameter("@Title", employee.Title),
new SqlParameter("@Address", employee.Address),
new SqlParameter("@City", employee.City),
new SqlParameter("@Region", employee.Region),
new SqlParameter("@PostalCode", employee.PostalCode),
new SqlParameter("@Country", employee.Country),
new SqlParameter("@Extension", employee.Extension)
};
return SqlDBHelper.ExecuteNonQuery("UpdateEmployee",
CommandType.StoredProcedure, parameters);
}
public bool DeleteEmployee(int empID)
{
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@empId", empID)
};
return SqlDBHelper.ExecuteNonQuery("DeleteEmployee",
CommandType.StoredProcedure, parameters);
}
public Employee GetEmployeeDetails(int empID)
{
Employee employee = null;
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@empId", empID)
};
//Lets get the list of all employees in a datataable
using (DataTable table =
SqlDBHelper.ExecuteParamerizedSelectCommand("GetEmployeeDetails",
CommandType.StoredProcedure, parameters))
{
//check if any record exist or not
if (table.Rows.Count == 1)
{
DataRow row = table.Rows[0];
//Lets go ahead and create the list of employees
employee = new Employee();
//Now lets populate the employee details into the list
of employees
employee.EmployeeID =
Convert.ToInt32(row["EmployeeID"]);
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
7 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
employee.LastName = row["LastName"].ToString();
employee.FirstName = row["FirstName"].ToString();
employee.Title = row["Title"].ToString();
employee.Address = row["Address"].ToString();
employee.City = row["City"].ToString();
employee.Region = row["Region"].ToString();
employee.PostalCode = row["PostalCode"].ToString();
employee.Country = row["Country"].ToString();
employee.Extension = row["Extension"].ToString();
}
}
return employee;
}
public List<employee> GetEmployeeList()
{
List<employee> listEmployees = null;
//Lets get the list of all employees in a datataable
using (DataTable table =
SqlDBHelper.ExecuteSelectCommand("GetEmployeeList", CommandType.StoredProcedure))
{
//check if any record exist or not
if (table.Rows.Count > 0)
{
//Lets go ahead and create the list of employees
listEmployees = new List<employee>();
//Now lets populate the employee details into the list
of employees
foreach (DataRow row in table.Rows)
{
Employee employee = new Employee();
employee.EmployeeID =
Convert.ToInt32(row["EmployeeID"]);
employee.LastName = row["LastName"].ToString();
employee.FirstName =
row["FirstName"].ToString();
employee.Title = row["Title"].ToString();
employee.Address = row["Address"].ToString();
employee.City = row["City"].ToString();
employee.Region = row["Region"].ToString();
employee.PostalCode =
row["PostalCode"].ToString();
employee.Country = row["Country"].ToString();
employee.Extension =
row["Extension"].ToString();
listEmployees.Add(employee);
}
}
}
return listEmployees;
}
}
</employee></employee></employee>
The class SqlDbHelper is a wrapper class for ADO.NET functions providing a more simpler
interface to use by the rest of DAL.
Collapse | Copy Code
class SqlDBHelper
{
const string CONNECTION_STRING = @"Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\NORTHWND.MDF;Integrated Security=True;User
Instance=True";
// This function will be used to execute R(CRUD) operation of parameterless
commands
internal static DataTable ExecuteSelectCommand(string CommandName, CommandType
cmdType)
{
DataTable table = null;
using (SqlConnection con = new SqlConnection(CONNECTION_STRING))
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandType = cmdType;
cmd.CommandText = CommandName;
try
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
using (SqlDataAdapter da = new
SqlDataAdapter(cmd))
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
8 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
{
table = new DataTable();
da.Fill(table);
}
}
catch
{
throw;
}
}
}
return table;
}
// This function will be used to execute R(CRUD) operation of parameterized
commands
internal static DataTable ExecuteParamerizedSelectCommand(string CommandName,
CommandType cmdType, SqlParameter[] param)
{
DataTable table = new DataTable();
using (SqlConnection con = new SqlConnection(CONNECTION_STRING))
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandType = cmdType;
cmd.CommandText = CommandName;
cmd.Parameters.AddRange(param);
try
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
using (SqlDataAdapter da = new
SqlDataAdapter(cmd))
{
da.Fill(table);
}
}
catch
{
throw;
}
}
}
return table;
}
// This function will be used to execute CUD(CRUD) operation of parameterized
commands
internal static bool ExecuteNonQuery(string CommandName, CommandType cmdType,
SqlParameter[] pars)
{
int result = 0;
using (SqlConnection con = new SqlConnection(CONNECTION_STRING))
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandType = cmdType;
cmd.CommandText = CommandName;
cmd.Parameters.AddRange(pars);
try
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
result = cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}
}
return (result > 0);
}
}
Note: If we use any ORM(Object Relation Mapper) then DAL need not be written. The ORM will
generate all the DAL code. Entity framework is one of the best ORMs available. This DAL can
simply be replaced with a class library containing the Entity Framework generated Entities
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
9 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
and Contexts.
The Business Logic Layer
The business logic layer will have a reference to the DAL and will mainly perform Business rule
validation and business logic specific calculations. In out example, I will write a simple BLL that
will govern the IO between the DAL and Presentation layer. In real applications the BLL will
contain more logic and code.
Collapse | Copy Code
public class EmployeeHandler
{
// Handle to the Employee DBAccess class
EmployeeDBAccess employeeDb = null;
public EmployeeHandler()
{
employeeDb = new EmployeeDBAccess();
}
// This fuction does not contain any business logic, it simply returns the
// list of employees, we can put some logic here if needed
public List<employee> GetEmployeeList()
{
return employeeDb.GetEmployeeList();
}
// This fuction does not contain any business logic, it simply returns the
// list of employees, we can put some logic here if needed
public bool UpdateEmployee(Employee employee)
{
return employeeDb.UpdateEmployee(employee);
}
// This fuction does not contain any business logic, it simply returns the
// list of employees, we can put some logic here if needed
public Employee GetEmployeeDetails(int empID)
{
return employeeDb.GetEmployeeDetails(empID);
}
// This fuction does not contain any business logic, it simply returns the
// list of employees, we can put some logic here if needed
public bool DeleteEmployee(int empID)
{
return employeeDb.DeleteEmployee(empID);
}
// This fuction does not contain any business logic, it simply returns the
// list of employees, we can put some logic here if needed
public bool AddNewEmployee(Employee employee)
{
return employeeDb.AddNewEmployee(employee);
}
}
The Presentation Layer
The presentation layer now contains only a set of pages and code behinds and it will use the BLL
and the the Employee class to perform all the operations. The add Operation can be seen as an
example how the BLL is being used to perform an operation.
Collapse | Copy Code
Employee emp = new Employee();
emp.LastName = txtLName.Text;
emp.FirstName = txtFName.Text;
emp.Address = txtAddress.Text;
emp.City = txtCity.Text;
emp.Country = txtCountry.Text;
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
10 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
emp.Region = txtRegion.Text;
emp.PostalCode = txtCode.Text;
emp.Extension = txtExtension.Text;
emp.Title = txtTitle.Text;
EmployeeHandler empHandler = new EmployeeHandler();
if (empHandler.AddNewEmployee(emp) == true)
{
//Successfully added a new employee in the database
Response.Redirect("Default.aspx");
}
Note: All the CRUD operations have been implemented. Please refer tio the sample code for all
the details. When we run the application we can see all the EDIT/UPDATE, DELETE and ADD
operations in action.
Point of Interest
I created this small application to demonstrate application development using n-tier architecture.
The demo application has been created to show the basic idea behind the 3-tier architecture.
There are many things that are still missing from this sample from the completion perspective.
Client side validation and server side validation in presentation layer, Business rule validation and
calculations in BLL are some missing things.
Since the idea here was to talk about how to put n-tier architecture in actual code, I think this
article might have provided some useful information on that. I hope this has been informative.
History
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
11 of 12
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
13 August 2012: First version
License
This article, along with any associated source code and files, is licensed under The Code Project
Open License (CPOL)
About the Author
Rahul
Rajat
Singh
Software
Developer
(Senior)
India
Member
Follow on
Twitter
I Started my Programming career with C++. Later got a chance to develop Windows Form
applications using C#. Now using C# & ASP.NET to write Information Systems, e-commerce/egovernance Portals and Data driven websites.
My interests involves Programming, Website development and Learning/Teaching subjects
related to Computer Science/Information Systems.
Some CodeProject Achievements:
2nd in Best C# article of December 2012
5th in Best overall article of December 2012
5th in Best C# article of October 2012
4th in Best Web Dev article of September 2012
3rd in Best C# article of August 2012
5th in Best Web Dev article of August 2012
5th in Best Web Dev article of July 2012
3rd in Best Overall article of June 2012
2nd in Best Web Dev article of June 2012
5th in Best Web Dev article of May 2012
6th in Best Web Dev article of April 2012
4th in Best C++ article of April 2012
5th in Best C++ article of March 2012
7th in Best Web Dev article of March 2012
5th in Best Web Dev article of February 2012
7th in Best Web Dev article of February 2012
9th in Best Web Dev article of February 2012
5th in Best C++ article of February 2012
Article Top
Like
13
Tweet
11
Sign Up to vote Poor
Excellent
Vote
Comments and Discussions
You must Sign In to use this message board.
12-02-2013 09:17
Creating ASP.NET Applications with N-Tier Architecture - CodeProject
http://www.codeproject.com/Articles/439688/Creating-ASP-NET-appli...
Search this forum
Profile popups
Spacing Relaxed
Noise Medium
Go
Layout Normal
Per page 25
Update
First Prev Next
Windows8 and Visual Studio 2012
Ultimate
Shantanu Chandra
Excellent
rashidalikhan
How to handle transactions associated
with multi business objects or entities?
xport
Re: How to handle transactions associated
with multi business objects or entities?
30 Jan '13 - 1:43
10 Jan '13 - 21:43
7 Dec '12 - 22:10
Rahul Rajat Singh
7 Dec '12 - 22:32
Integrate With jQuery
Chinni007
7 Dec '12 - 6:17
missing directive/assembly reference
YinYang2050
1 Dec '12 - 8:03
Rahul Rajat Singh
3 Dec '12 - 17:58
interference UI with DAL
Member 1208478
21 Nov '12 - 1:43
Master detail
s_safdar
14 Nov '12 - 8:36
Rahul Rajat Singh
14 Nov '12 - 18:13
Re: missing directive/assembly reference
Re: Master detail
My vote of 4
vsanju
11 Nov '12 - 23:00
My vote of 5
Darkjo
7 Nov '12 - 22:46
My vote of 5
Savalia Manoj M
7 Nov '12 - 17:46
Very good.
mark merrens
Excellent
Shashank Shrivastava
Re: Excellent
2 Oct '12 - 8:56
28 Aug '12 - 22:26
Rahul Rajat Singh
Re: Excellent
28 Aug '12 - 22:45
Sanjay K. Gupta
Re: Excellent
31 Aug '12 - 4:24
Rahul Rajat Singh
31 Aug '12 - 19:17
Article of the Day on Microsoft's site
[modified]
Rahul Rajat Singh
28 Aug '12 - 19:20
My vote of 4
pradiprenushe
27 Aug '12 - 3:57
My vote of 3
mahdi87_gh
23 Aug '12 - 0:48
N Tier or layer
Sakshi Smriti
21 Aug '12 - 19:54
Re: N Tier or layer
Re: N Tier or layer
My vote of 5
Last Visit: 1 Jan '13 - 7:46
General
News
Rahul Rajat Singh
21 Aug '12 - 20:01
Sakshi Smriti
21 Aug '12 - 20:24
Sakshi Smriti
21 Aug '12 - 19:51
Last Update: 11 Feb '13 - 12:45
Suggestion
Question
Refresh
Bug
Answer
Joke
1 2
Rant
Next
Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.
Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130211.1 | Last Updated 21 Aug 2012
12 of 12
Layout: fixed | fluid
Article Copyright 2012 by Rahul Rajat Singh
Everything else Copyright CodeProject, 1999-2013
Terms of Use
12-02-2013 09:17