برنامه نویسی چند لایه قسمت دوم : لایه ارتباط با پایگاه داده (Data Access Layer یا DAL) :
در قست اول مقاله (مقدمه برنامه نویسی چند لایه) در مورد لایه بندی پروژه و مزایای استفاده از معماری چند لایه صحبت شد ، در این مقاله تئوری های گفته شده را عملی خواهیم کرد .
برای شروع برای اینکه یک پروژه تمیز داشته باشیم قدم به قدم به صورت زیر عمل نمایید :
- نرم افزار ویژوال استودیو را باز نمایید ، وارد منوی File و سپس New Project شوید
- از لیست سمت چپ (Project Types) گزینه Other Project Types و سپس Visual Studio Solution را برگزینید
- از لیست سمت راست (Templates) گزینه Blank Solution را انتخاب نمایید
- یک نام برای Solution خود در قسمت Name وارد نمایید
- مسیر Location را به دایرکتوری مجازی خود تغییر دهید (مثلا C:\Intepub\wwwroot ) و تایید نمایید
اکنون شما یک Solution خالی در مسیر دایرکتوری مجازی IIS ایجاد کرده اید ، ما در این پروژه خالی لایه ها را ایجاد خواهیم کرد ، هر یک از لایه ها به صورت یک پروژه جداگانه از نوع Class Library خواهند بود .
برای ایجاد یک لایه جدید به صورت زیر عمل نمایید :
- وارد منوی File > Add > Add New Project شده
- از سمت چپ زبان مورد نظر خودتان را انتخاب نمایید (Visual C Sharp یا Visual Basic)
- از سمت راست گزیته Class Library را انتخاب نمایید
- در فیلد Name نام لایه را تایپ نموده (در اینجا نام DAL را برای لایه ارتباط با دیتابیس وارد می کنید) و تایید نمایید
برای اضافه نمودن لایه Bussiness Logic هم دقیقا روال فوق را طی کرده و نام BLL را وارد می نماییم .
برای ایجاد لایه User Interface یا UI به دلیل اینکه وب سایت ما را تشکیل می دهد بایک یک پروژه از نوع WebSite اضافه نماییم ، بنابراین وارد منوی File>Add >Add New Website شده ، مسیر Location را بر اساس پروژه ایجاد شده وارد نمایید (مثلا http://localhost/3-tier ) این کار باعث می شود که هم دایرکتوری مجازی ایجاد شود و هم اینکه لایه مورد نظر داخل پروژه قرار گیرد .
اگر از IIS استفاده نمی کنید کافیست مسیر را به صورت فیزیکی ست نمایید : C:\Inetpub\wwwroot\3-tier
تا اینجای کار ما 3 لایه ای که مد نظرمان بود را اضافه کردیم ، اکنون به سراغ لایه DAL می رویم .
به صورت پیشفرض یک کلاس به نام Class1 داخل این پروژه وجود دارد ، آن را حذف نمایید .
همانطور که در مقاله قبلی توضیح دادم این لایه تمام عملیات مربوط به بانک اطلاعاتی را انجام می دهد ، معمولا ما برای هر جدول از دیتابیس یک کلاس در این لایه ایجاد می کنیم ، اگر جدول های شما ارتباط تنگانگی باهم دارند میتوانید برای یک مجموعه از جداول یک کلاس در نظر بگیرید .
به عنوان مثال اگر یک جدول برای ذخیره نام کشور ها و یک جدول برای نام شهر ها دارید میتوانید آن ها را در یک کلاس قرار دهید ولی اگر یک جدول برای ذخیره کاربران و یک جدول برای مقالاتی که کاربران ارسال کرده اند دارید هر یک از این جداول را با یک کلاس Map می کنیم .
قبل از اینکه به سراغ ساخت کلاس ها برویم ، یک کلاس مادر ایجاد می کنیم که برخی از متدها و خواص عمومی را برای ما انجام می دهد ، بنابراین در لایه DAL گزینه Add New Item را از منوی Project انتخاب کرده و یک Class با نام DALBase.cs اضافه نمایید :
اگر کلاس شما از نوع Public نبود کلمه Public را به قبل نام class اضافه نمایید :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DAL
{
public class DALBase
{
}
}
این کلاس میتواند شامل رشته اتصال و همچنین مجموعه ای از توابع و متدها برای کار با بانک اطلاعاتی باشد (به عنوان مثال متد ExecuteNoneQuery را در کلاس زیر پیاده سازی کرده ایم ، بقیه متد ها در فایل ضمیمه موجود می باشد) :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class DALBase
{
public string ConnectionString
{
get
{
return "Data Source=.;Initial Catalog=Db;Integrated Security=True";
}
}
public int ExecuteNoneQuery(CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = commandType;
cmd.CommandText = commandText;
cmd.Parameters.AddRange(commandParameters);
con.Open();
int retVal = cmd.ExecuteNonQuery();
con.Close();
return retVal;
}
}
}
}
همچنین میتوانید رشته اتصال را از App.Config هم فراخوانی نمایید (در فایل ضمیمه این کار در App.Config انجام شده است) .
البته شما میتوانید از Microsoft Application Block یا Microsoft Enterprise Library برای این کار استفاده کنید .
برای استفاده از این کتابخانه ها ابتدا این کتابخانه را از اینجا دانلود کرده و سپس توسط Add Refrence به پروژه اضافه کنید ، و به جای متدهایی که خودتان می نویسید از این کتابخانه استفاده نمایید .
برای شروع کار یک دیتابیس ایجاد کرده و جدولی برای ذخیره اطلاعات کاربران در آن قرار دهید :
TBLUsers :
- UserID : int
- FirstName : nvarchar 50
- LastName : nvarchar 50
- EmailAddress : nvarchar 50
- Username : nvarchar 20
- Password : nvarchar 10
- UserStatus : tinyint
اکنون میخواهیم کلاس مربوط به این جدول را در لایه DAL ایجاد کنیم ، بدین منظور در پروژه مربوط به لایه DAL وارد Add new item شده و یک آیتم از نوع Class با نام Users.cs اضافه نمایید ، کلاسی شبیه کلاس زیر ایجاد خواهد شد :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DAL
{
class Users
{
}
}
قبل از هر چیز این کلاس را Public نموده و سپس از کلاس مادر ارث بری می کنیم :
public class Users : DALBase
{
}
اکنون متد های مورد نیاز را ایجاد می کنیم ، به عنوان مثال متد Insert :
public int AddNewUser(string firstName, string lastName, string emailAddress, string username, string password, byte userStatus)
{
return ExecuteNoneQuery(System.Data.CommandType.StoredProcedure, "AddNewUser", new SqlParameter[] {
new SqlParameter("@firstName", firstName),
new SqlParameter("@lastName", lastName),
new SqlParameter("@emailAddress",emailAddress),
new SqlParameter("@password",password),
new SqlParameter("@userStatus",userStatus),
});
}
و متدی برای دریافت اطلاعات :
public SqlDataReader GetUserByUserID(int userId)
{
return ExecuteReader(System.Data.CommandType.StoredProcedure, "GetUserByUserID", new SqlParameter[] {
new SqlParameter("@userId", userId),
});
}
و متدهای دیگری که باید پیاده سازی شود (مانند حذف و به روز رسانی و ....)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
namespace DAL
{
public class Users : DALBase
{
public int AddNewUser(string firstName, string lastName, string emailAddress, string username, string password, byte userStatus)
{
return ExecuteNoneQuery(System.Data.CommandType.StoredProcedure, "AddNewUser", new SqlParameter[] {
new SqlParameter("@firstName", firstName),
new SqlParameter("@lastName", lastName),
new SqlParameter("@emailAddress",emailAddress),
new SqlParameter("@password",password),
new SqlParameter("@userStatus",userStatus),
});
}
public SqlDataReader GetUserByUserID(int userId)
{
return ExecuteReader(System.Data.CommandType.StoredProcedure, "GetUserByUserID", new SqlParameter[] {
new SqlParameter("@userId", userId),
});
}
}
}
در مقاله بعدی از این لایه در ایجاد لایه BLL استفاده خواهیم کرد .
فایل ضمیمه را از اینجا دانلود نمایید