Top Banner
4-Tier Architecture in ASP.NET with C# I am using 3-Tier architecture in my different projects, but adding a 4th tier is a novelty for me. After reading this article, I can see the benefits to add a Business Access Layer in some complex scenarios. From the author: Almost all of us must have heard about 3-Tier architecture but what is this 4-Tier architecture? What are the benefits and how it is different from other architectures? Well, the architecture I am going to demonstrate here is just enhancement of 3-Tier archicture. In this architecture; you no need of writing long function parameters throughout the layers (as in traditionally 3-Tier archicture has to) and the actual objects of the application will be in a separate tier so that in future you can separately use these objects for enhancements. Change in the object definition can be done without touching the entire Business Access Layers ............ Let me explain you step-wise process of creatioin of 4-Tier architecture application. In this application, I am going to take example of a Person that will have 3 properties: FirstName, LastName, Age. We will create a separate pages to insert these records (default.aspx) into database and list,update,delete records (list.aspx) from database. In this application we will have following 4-Tiers 1. Business Object [BO] 2. Business Access Layer [BAL] 3. Data Access Layer [DAL] 4. UI (4-Tier) folder [UI] Well, the architecture I am going to demonstrate here is just enhancement of 3-Tier archicture. In this architecture; you no need of writing long function parameters throughout the layers (as in traditionally 3-Tier archicture has to) and the actual objects of the application will be in a separate tier so that in future you can separately use these objects for enhancements. Change in the object definition can be done without touching the entire Business Access Layers ............ Let me explain you step-wise process of creatioin of 4-Tier architecture application. In this application, I am going to take example of a Person that will have 3 properties: FirstName, LastName, Age. We will create a separate pages to insert these records (default.aspx) into database and list,update,delete records (list.aspx) from database. In this application we will have following 4-Tiers 1. Business Object [BO] 2. Business Access Layer [BAL] 3. Data Access Layer [DAL] 4. UI (4-Tier) folder [UI] Picture - 1 (Solution Explorer)
30
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 4-Tier Architecture in ASP.net With C#

4-Tier Architecture in ASP.NET with C# I am using 3-Tier architecture in my different projects, but adding a 4th tier is a novelty for me.After reading this article, I can see the benefits to add a Business Access Layer in some complex scenarios.From the author:Almost all of us must have heard about 3-Tier architecture but what is this 4-Tier architecture? What are the benefits and how it is different from other architectures?  Well, the architecture I am going to demonstrate here is just enhancement of 3-Tier archicture. In this architecture; you no need of writing long function parameters throughout the layers (as in traditionally 3-Tier archicture has to) and the actual objects of the application will be in a separate tier so that in future you can separately use these objects for enhancements. Change in the object definition can be done without touching the entire Business Access Layers ............

Let me explain you step-wise process of creatioin of 4-Tier architecture application.

In this application, I am going to take example of a Person that will have 3 properties: FirstName, LastName, Age. We will create a separate pages to insert these records (default.aspx) into database and list,update,delete records (list.aspx) from database.

In this application we will have following 4-Tiers 1. Business Object [BO] 2. Business Access Layer [BAL] 3. Data Access Layer [DAL] 4. UI (4-Tier) folder [UI]

Well, the architecture I am going to demonstrate here is just enhancement of 3-Tier archicture. In this architecture; you no need of writing long function parameters throughout the layers (as in traditionally 3-Tier archicture has to) and the actual objects of the application will be in a separate tier so that in future you can separately use these objects for enhancements. Change in the object definition can be done without touching the entire Business Access Layers ............

Let me explain you step-wise process of creatioin of 4-Tier architecture application.

In this application, I am going to take example of a Person that will have 3 properties: FirstName, LastName, Age. We will create a separate pages to insert these records (default.aspx) into database and list,update,delete records (list.aspx) from database.

In this application we will have following 4-Tiers 1. Business Object [BO] 2. Business Access Layer [BAL] 3. Data Access Layer [DAL] 4. UI (4-Tier) folder [UI]

Picture - 1 (Solution Explorer)

For simplicity reason, I have created separate folders for first 3-tiers into App_Code folder. You can create a separate projects for these tiers and add into forth tier (UI) solution.

Lets create above tiers one by one.

Business Object [BO - Person.cs]

Create a separate folder by right-clicking App_Code folder and name it as BO. Right click this folder and create a new .cs (Class) file named Person.cs. Write following code inside it.

- Hide Code

Page 2: 4-Tier Architecture in ASP.net With C#

int m_PersonID = 0;

string m_FirstName = string.Empty;

string m_LastName = string.Empty;

int m_Age = 0;

#region Propertiers

public int PersonID

{

get { return m_PersonID; }

set { m_PersonID = value; }

}

public string FirstName

{

get { return m_FirstName; }

set { m_FirstName = value; }

}

public string LastName

{

get { return m_LastName; }

set { m_LastName = value; }

}

public int Age

{

get { return m_Age; }

set { m_Age = value; }

}

#endregion Properties

Page 3: 4-Tier Architecture in ASP.net With C#

Here, we are first declaring 4 variables for corresponding properites and defining properties for them.This is your Business Object with all its properties/attributes to work with. Next step is to create Data Access Layer.

Data Access Layer [DAL - PersonDAL.cs]

The way you created BO folder inside App_Code folder, create another folder named DAL. Create a .cs file inside it and name it as PersonDAL.cs

Write following code inside it (You can copy-paste).

- Hide Code

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

/// <summary>

/// Summary description for PersonDAL

/// </summary>

public class PersonDAL

{

string connStr = ConfigurationManager.ConnectionStrings["TutTestConn"].ToString();

public PersonDAL()

{

Page 4: 4-Tier Architecture in ASP.net With C#

}

/// <summary>

/// Used to insert records into database

/// </summary>

/// <param name="p"></param>

/// <returns></returns>

public int Insert(Person person)

{

SqlConnection conn = new SqlConnection(connStr);

conn.Open();

SqlCommand dCmd = new SqlCommand("InsertData", conn);

dCmd.CommandType = CommandType.StoredProcedure;

try

{

dCmd.Parameters.AddWithValue("@firstName", person.FirstName);

dCmd.Parameters.AddWithValue("@lastName", person.LastName);

dCmd.Parameters.AddWithValue("@age", person.Age);

return dCmd.ExecuteNonQuery();

}

catch

{

throw;

}

finally

{

dCmd.Dispose();

conn.Close();

conn.Dispose();

}

Page 5: 4-Tier Architecture in ASP.net With C#

}

/// <summary>

/// Update record into database

/// </summary>

/// <param name="p"></param>

/// <returns></returns>

public int Update(Person person)

{

SqlConnection conn = new SqlConnection(connStr);

conn.Open();

SqlCommand dCmd = new SqlCommand("UpdateData", conn);

dCmd.CommandType = CommandType.StoredProcedure;

try

{

dCmd.Parameters.AddWithValue("@firstName", person.FirstName);

dCmd.Parameters.AddWithValue("@lastName", person.LastName);

dCmd.Parameters.AddWithValue("@age", person.Age);

dCmd.Parameters.AddWithValue("@personID", person.PersonID);

return dCmd.ExecuteNonQuery();

}

catch

{

throw;

}

finally

{

dCmd.Dispose();

conn.Close();

Page 6: 4-Tier Architecture in ASP.net With C#

conn.Dispose();

}

}

/// <summary>

/// Load all records from database

/// </summary>

/// <returns></returns>

public DataTable Load()

{

SqlConnection conn = new SqlConnection(connStr);

SqlDataAdapter dAd = new SqlDataAdapter("LoadAll", conn);

dAd.SelectCommand.CommandType = CommandType.StoredProcedure;

DataSet dSet = new DataSet();

try

{

dAd.Fill(dSet, "PersonTable");

return dSet.Tables["PersonTable"];

}

catch

{

throw;

}

finally

{

dSet.Dispose();

dAd.Dispose();

conn.Close();

conn.Dispose();

}

Page 7: 4-Tier Architecture in ASP.net With C#

}

/// <summary>

/// Delete record from database

/// </summary>

/// <param name="person"></param>

/// <returns></returns>

public int Delete(Person person)

{

SqlConnection conn = new SqlConnection(connStr);

conn.Open();

SqlCommand dCmd = new SqlCommand("DeleteData", conn);

dCmd.CommandType = CommandType.StoredProcedure;

try

{

dCmd.Parameters.AddWithValue("@personID", person.PersonID);

return dCmd.ExecuteNonQuery();

}

catch

{

throw;

}

finally

{

dCmd.Dispose();

conn.Close();

conn.Dispose();

}

}

Page 8: 4-Tier Architecture in ASP.net With C#

}

In this class file, we have Insert, Update, Delete, Load methods. In this class file, first I am getting the connection string from the web.config file in a class level variable called connStr and using the same string in all my methods to open the connection.

For simplicity reason, I have not shown the code for Stored Procedure, however you can get the complete database and code by downloading the Source Code files. This was your Data Access Layer. Till now you have your Business Object and Data Access Layer ready. Now lets go to the third layer and create Business Access Layer.

Business Access Layer [BAL - PersonBAL.cs]

Again, right click App_Code folder and add a new folder named BAL. Create a new class file inside it and name it as PersonBAL.cs. Write following code inside it.

- Hide Code

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

/// <summary>

/// Summary description for PersonBAL

/// </summary>

public class PersonBAL

{

public PersonBAL()

{

}

Page 9: 4-Tier Architecture in ASP.net With C#

/// <summary>

/// insert records into database

/// </summary>

/// <param name="person"></param>

/// <returns></returns>

public int Insert(Person person)

{

PersonDAL pDAL = new PersonDAL();

try

{

return pDAL.Insert(person);

}

catch

{

throw;

}

finally

{

pDAL = null;

}

}

/// <summary>

/// Update records into database

/// </summary>

/// <param name="person"></param>

/// <returns></returns>

public int Update(Person person)

{

Page 10: 4-Tier Architecture in ASP.net With C#

PersonDAL pDAL = new PersonDAL();

try

{

return pDAL.Update(person);

}

catch

{

throw;

}

finally

{

pDAL = null;

}

}

/// <summary>

/// Load records from database

/// </summary>

/// <returns></returns>

public DataTable Load()

{

PersonDAL pDAL = new PersonDAL();

try

{

return pDAL.Load();

}

catch

{

throw;

}

Page 11: 4-Tier Architecture in ASP.net With C#

finally

{

pDAL = null;

}

}

/// <summary>

/// Delete record from database

/// </summary>

/// <param name="person"></param>

/// <returns></returns>

public int Delete(Person person)

{

PersonDAL pDAL = new PersonDAL();

try

{

return pDAL.Delete(person);

}

catch

{

throw;

}

finally

{

pDAL = null;

}

}

}

Page 12: 4-Tier Architecture in ASP.net With C#

Here, we are creating separate methods each for respective PersonDAL.cs methods here. As in our case we don't have any business logic, so we are just instantiating the Data Access Layer objects, using its methods and and returning to UI (fourth layer, described later on).

You must have noticed here that in the try catch block, I am just writing throw; statement. This is because when any error will occur it will be send to the calling layers (in our case UI) and there we will handle it.

Till now, we have BO, BAL and DAL ready. Now we are left with our application face, I mean UI. Lets first create default.aspx file that will contain one form and textboxs that will be used to enter records.

User Interface - [UI]-Default.aspx

Create a separate folder in your UI solution named 4-Tier and add one .aspx page called Default.aspx (Picture - 2). In this page, we will write ASP.NET code to render textboxes and buttons. OnClick event of the button we will calll AddRecords method that will ultimately insert the records into database. Below is the code to render the asp.net form.

- Hide Code

<form id="form1" runat="server">

<div>

<p><a href="List.aspx">List Records</a></p>

<asp:Label ID="lblMessage" runat="Server" ForeColor="red"

EnableViewState="False"></asp:Label>

<table style="border:2px solid #cccccc;">

<tr style="background-color:#ECF3AB;">

<th colspan="3">Add Records</th>

</tr>

<tr>

<td>

First Name:

</td>

<td>

<asp:TextBox ID="txtFirstName" runat="Server"></asp:TextBox>

</td>

<td>

<asp:RequiredFieldValidator ID="req1" runat="Server" Text="*"

Page 13: 4-Tier Architecture in ASP.net With C#

ControlToValidate="txtFirstName" Display="dynamic"></asp:RequiredFieldValidator>

</td>

</tr>

<tr>

<td>

Last Name:

</td>

<td>

<asp:TextBox ID="txtLastName" runat="Server"></asp:TextBox>

</td>

<td>

<asp:RequiredFieldValidator ID="req2" runat="Server" Text="*"

ControlToValidate="txtLastName" Display="dynamic"></asp:RequiredFieldValidator>

</td>

</tr>

<tr>

<td>

Age:

</td>

<td>

<asp:TextBox ID="txtAge" runat="Server" Columns="4"></asp:TextBox>

</td>

<td>

<asp:RequiredFieldValidator ID="req3" runat="Server" Text="*" ControlToValidate="txtAge"

Display="dynamic"></asp:RequiredFieldValidator>

<asp:CompareValidator ID="Comp1" runat="Server" Text="Only integer"

Page 14: 4-Tier Architecture in ASP.net With C#

ControlToValidate="txtAge" Operator="DataTypeCheck" Type="Integer"></asp:CompareValidator>

</td>

</tr>

<tr>

<td> </td>

<td>

<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="AddRecords" />

</td>

</tr>

</table>

</div>

</form>

Picture - 2 (Default.aspx)

AddRecords method

- Hide Code

protected void AddRecords(object sender, EventArgs e)

{

//Lets validate the page first

if (!Page.IsValid)

return;

int intResult = 0;

// Page is valid, lets go ahead and insert records

// Instantiate BAL object

PersonBAL pBAL = new PersonBAL();

// Instantiate the object we have to deal with

Page 15: 4-Tier Architecture in ASP.net With C#

Person person = new Person();

// set the properties of the object

person.FirstName = txtFirstName.Text;

person.LastName = txtLastName.Text;

person.Age = Int32.Parse(txtAge.Text);

try

{

intResult = pBAL.Insert(person);

if (intResult > 0)

lblMessage.Text = "New record inserted successfully.";

else

lblMessage.Text = "FirstName [<b>"+ txtFirstName.Text +"</b>] alredy exists, try another

name";

}

catch (Exception ee)

{

lblMessage.Text = ee.Message.ToString();

}

finally

{

person = null;

pBAL = null;

}

}

In the above method, I am doing following things mainly: 1. Instantiating BAL object 2. Instantiating BO object

Page 16: 4-Tier Architecture in ASP.net With C#

3. Settinng properties of BO object by the textbox values 4. Calling Insert method of the BAL object and passing BO object as parameter [pBAL.Insert(person)] in try block 5. Checking for number of records affected, If the number is more than zero, I am writing Success message otherwise Duplicate records found. 6. If any layer will throw any error, I am catching it and displaying to the user in throw block. 7. Whatever objects I had instantiated, I am specifying their values to null to let the GC know that I am no more going to use them.

User Interface - [UI]-List.aspx

In this page, I am going to use a GridView to List, Modify, Sort and Delete records from the database. Create an .aspx page in the same 4-Tier folder named List.aspx (Picture - 3). Following is the code for the GridView that will do data manipulation for us.

- Hide Code

<form id="form1" runat="server">

<div>

<p><a href="Default.aspx">Add Record</a></p>

<asp:Label ID="lblMessage" runat="Server" ForeColor="red" EnableViewState="False"></asp:Label>

<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None"

DataKeyNames="PersonID" AutoGenerateEditButton="True" AutoGenerateColumns="False"

OnRowEditing="EditRecord" OnRowUpdating="UpdateRecord" OnRowCancelingEdit="CancelRecord"

OnRowDeleting="DeleteRecord" AllowPaging="True" AllowSorting="true" PageSize="5"

OnPageIndexChanging="ChangePage" OnSorting="SortRecords">

<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />

<RowStyle BackColor="#EFF3FB" />

<EditRowStyle BackColor="#2ff1BF" />

<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />

<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />

<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />

<AlternatingRowStyle BackColor="White" />

<Columns>

<asp:BoundField DataField="PersonID" HeaderText="Person ID" ReadOnly="True" SortExpression="PersonID" />

<asp:TemplateField HeaderText="First Name" SortExpression="FirstName">

<ItemTemplate>

Page 17: 4-Tier Architecture in ASP.net With C#

<%# Eval("FirstName") %>

</ItemTemplate>

<EditItemTemplate>

<asp:TextBox ID="txtFName" runat="Server" Text='<%# Eval("FirstName") %>'></asp:TextBox>

</EditItemTemplate>

</asp:TemplateField>

<asp:TemplateField HeaderText="Last Name" SortExpression="LastName">

<ItemTemplate>

<%# Eval("LastName") %>

</ItemTemplate>

<EditItemTemplate>

<asp:TextBox ID="txtLName" runat="Server" Text='<%# Eval("LastName") %>'></asp:TextBox>

</EditItemTemplate>

</asp:TemplateField>

<asp:TemplateField HeaderText="Age" SortExpression="Age">

<ItemTemplate>

<%# Eval("Age") %>

</ItemTemplate>

<EditItemTemplate>

<asp:TextBox ID="txtAge" runat="Server" Text='<%# Eval("Age") %>'></asp:TextBox>

</EditItemTemplate>

</asp:TemplateField>

<asp:TemplateField HeaderText="Delete?">

<ItemTemplate>

<span onclick="return confirm('Are you sure to Delete?')">

<asp:LinkButton ID="lnBD" runat="server" Text="Delete" CommandName="Delete"></asp:LinkButton>

</span>

</ItemTemplate>

</asp:TemplateField>

Page 18: 4-Tier Architecture in ASP.net With C#

</Columns>

</asp:GridView>

</div>

</form>

Picture - 3 (List.aspx)

On the OnRowEditing, OnRowUpdating, OnRowCancelEdit, OnSorting and OnRowDeleting events we are calling respective methods to do data manipulation. Following are codes to bind the GridView and methods that will fire on GridView events.

- Hide Code

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

BindGrid();

}

/// <summary>

/// Fired when Cancel button is clicked

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void CancelRecord(object sender, GridViewCancelEditEventArgs e)

{

GridView1.EditIndex = -1;

BindGrid();

}

Page 19: 4-Tier Architecture in ASP.net With C#

/// <summary>

/// Fires when Edit button is clicked

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void EditRecord(object sender, GridViewEditEventArgs e)

{

GridView1.EditIndex = e.NewEditIndex;

BindGrid();

}

/// <summary>

/// Fires when Update button is clicked

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void UpdateRecord(object sender, GridViewUpdateEventArgs e)

{

int personID = Int32.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());

int intResult = 0;

GridViewRow row = GridView1.Rows[e.RowIndex];

TextBox tFN = (TextBox) row.FindControl("txtFName");

TextBox tLN = (TextBox)row.FindControl("txtLName");

TextBox tAge = (TextBox)row.FindControl("txtAge");

// instantiate BAL

PersonBAL pBAL = new PersonBAL();

Page 20: 4-Tier Architecture in ASP.net With C#

Person person = new Person();

try

{

person.PersonID = personID;

person.FirstName = tFN.Text;

person.LastName = tLN.Text;

person.Age = Int32.Parse(tAge.Text);

intResult = pBAL.Update(person);

if (intResult > 0)

lblMessage.Text = "Record Updated Successfully.";

else

lblMessage.Text = "Record couldn't updated";

}

catch (Exception ee)

{

lblMessage.Text = ee.Message.ToString();

}

finally

{

person = null;

pBAL = null;

}

GridView1.EditIndex = -1;

// Refresh the list

BindGrid();

}

/// <summary>

/// fires when Delete button is clicked

Page 21: 4-Tier Architecture in ASP.net With C#

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void DeleteRecord(object sender, GridViewDeleteEventArgs e)

{

int personID = Int32.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());

// instantiate BAL

PersonBAL pBAL = new PersonBAL();

Person person = new Person();

try

{

person.PersonID = personID;

pBAL.Delete(person);

lblMessage.Text = "Record Deleted Successfully.";

}

catch (Exception ee)

{

lblMessage.Text = ee.Message.ToString();

}

finally

{

person = null;

pBAL = null;

}

GridView1.EditIndex = -1;

// Refresh the list

Page 22: 4-Tier Architecture in ASP.net With C#

BindGrid();

}

/// <summary>

/// Fires when page links are clicked

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void ChangePage(object sender, GridViewPageEventArgs e)

{

GridView1.PageIndex = e.NewPageIndex;

// Refresh the list

BindGrid();

}

/// <summary>

/// Fires when Columns heading are clicked

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void SortRecords(object sender, GridViewSortEventArgs e)

{

DataTable dataTable = GridDataSource();

if (dataTable != null)

{

DataView dataView = new DataView(dataTable);

dataView.Sort = GetSortExpression(e);

Page 23: 4-Tier Architecture in ASP.net With C#

GridView1.DataSource = dataView;

GridView1.DataBind();

}

}

#region Private Methods

/// <summary>

/// Bind the gridview

/// </summary>

private void BindGrid()

{

GridView1.DataSource = GridDataSource();

GridView1.DataBind();

}

/// <summary>

/// Get GridView DataSource

/// </summary>

private DataTable GridDataSource()

{

PersonBAL p = new PersonBAL();

DataTable dTable = new DataTable();

try

{

dTable = p.Load();

}

catch (Exception ee)

{

lblMessage.Text = ee.Message.ToString();

Page 24: 4-Tier Architecture in ASP.net With C#

}

finally

{

p = null;

}

return dTable;

}

/// <summary>

/// Get sort expression for the gridview

/// </summary>

/// <param name="e"></param>

/// <returns></returns>

private string GetSortExpression(GridViewSortEventArgs e)

{

string sortDirection = string.Empty;

// if clicked on the same column twice then let it toggle the sort order, else reset to ascending

if (ViewState["SortExpression"] != null)

{

if (!ViewState["SortExpression"].ToString().Equals(e.SortExpression.ToLower()))

{

ViewState["SortDirection"] = null;

}

}

if (ViewState["SortDirection"] != null)

{

if (ViewState["SortDirection"].ToString().Equals("ASC"))

{

Page 25: 4-Tier Architecture in ASP.net With C#

sortDirection = "DESC";

ViewState["SortDirection"] = "DESC";

}

else

{

sortDirection = "ASC";

ViewState["SortDirection"] = "ASC";

}

}

else

{

ViewState["SortDirection"] = "ASC";

}

ViewState["SortExpression"] = e.SortExpression.ToLower();

return e.SortExpression + " " + sortDirection;

}

#endregion Private Methods

Thats it!!!

Now we have done all our home work, Its time to enjoy now. Just build the application by pressing Ctrl+Shift+B, once it shows Build Succeeded in the status bar at the bottom, you are ready to enjoy your 4-Tier architecture application.

Browse it as http://localhost/4-Tier (Provided you have created "4-Tier" virtual directory in your IIS or you can choose your own virtual directory name), you should see your screens as shown above (default.aspx and list.aspx pages).

Try manipulating data and see how effectively its happening. This was a simple application, based on this architecture, you can create larger application by adding separate objects and their corresponding tiers.

In order to use namespace in different tiers, you should define your namespace in respective tiers objects and use those namespace by using statement whereever you need.