مثال على تصميم لData Tier افترض وجود Database بهذا التصميم
:: منتديات التصميم و البرمجة :: منتدى برمجة الألعاب والجرافيكس والتصميم :: قسم : برمجة الألعاب والجرافكس العام
صفحة 1 من اصل 1
مثال على تصميم لData Tier افترض وجود Database بهذا التصميم
على تصميم لData Tier
افترض وجود Database بهذا التصميم
بمعنى أنه اذا فرضنا أننا نملك Database تحوي Tables بهذه الأسماء User, Article and Category
يمكننا أن نقول أن كل Proxy Class تتكون من Base Class و Child Class
الBase
Class تحدد الشكل الأساسي للClass و الChild يحدد الImplementation الخاص
بهذه الClass على نوع محدد من الData Sources بمعنى أنه اذا اردنا أن نجعل
الApplication يعمل على ال SqlServer سنقوم بعمل Inheritance من ال Proxy
Base و عمل SqlProxy Child مخصص للSql Server
و هذا يسهل التحول من
من Data Source الى اخر مجرد اعادة عمل الInheritance من الPorxyBase لعمل
مثلاً OracleProxy و تحديد الImplementation الخاص بالOracle
هذا مثال على Proxy Base Class
و يكون هذا شكل الSqlProxy
افترض وجود Database بهذا التصميم
بمعنى أنه اذا فرضنا أننا نملك Database تحوي Tables بهذه الأسماء User, Article and Category
يمكننا أن نقول أن كل Proxy Class تتكون من Base Class و Child Class
الBase
Class تحدد الشكل الأساسي للClass و الChild يحدد الImplementation الخاص
بهذه الClass على نوع محدد من الData Sources بمعنى أنه اذا اردنا أن نجعل
الApplication يعمل على ال SqlServer سنقوم بعمل Inheritance من ال Proxy
Base و عمل SqlProxy Child مخصص للSql Server
و هذا يسهل التحول من
من Data Source الى اخر مجرد اعادة عمل الInheritance من الPorxyBase لعمل
مثلاً OracleProxy و تحديد الImplementation الخاص بالOracle
هذا مثال على Proxy Base Class
- الكود:
using System.Collections;
using DataAccessLayer;
using Info_Tier;
namespace Data_Tier
{
public abstract class Proxy_Article
{
protected DAL m_conn;
protected string m_strConn;
public Proxy_Article()
{
m_strConn = Connection.GetConnectionString();
m_conn = new DAL(DbProvider.SqlServer, m_strConn);
}
public abstract int ArticleAdd(Info_Article info_Article);
public abstract void ArticleModifyBySID(int SID, Info_Article info_Article);
public abstract ArrayList ArticleGetAll();
public abstract void ArticleDelete(int SID);
public abstract Info_Article ArticleGet(int SID);
public abstract ArrayList ArticleGetByPerson_SID(int Person_SID);
}
}
و يكون هذا شكل الSqlProxy
- الكود:
using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using Info_Tier;
namespace Data_Tier
{
public class SqlProxy_Article : Proxy_Article
{
public SqlProxy_Article()
{
}
public override int ArticleAdd(Info_Article info_Article)
{
SqlParameter[] parameters = new SqlParameter[5];
parameters[0] = new SqlParameter("@SID", info_Article.SID);
parameters[0].Direction = ParameterDirection.Output;
parameters[1] = new SqlParameter("@Subject", info_Article.Subject);
parameters[1].Direction = ParameterDirection.Input;
parameters[2] = new SqlParameter("@Details", info_Article.Details);
parameters[2].Direction = ParameterDirection.Input;
parameters[3] = new SqlParameter("@MadeOn", info_Article.MadeOn);
parameters[3].Direction = ParameterDirection.Input;
parameters[4] = new SqlParameter("@Person_SID", info_Article.Person_SID);
parameters[4].Direction = ParameterDirection.Input;
m_conn.ExecuteStoredProcedureNonQuery("spArticleAdd", parameters);
return (int) parameters[0].Value;
}
public override void ArticleModifyBySID(int SID, Info_Article info_Article)
{
SqlParameter[] parameters = new SqlParameter[5];
parameters[0] = new SqlParameter("@SID", info_Article.SID);
parameters[1] = new SqlParameter("@Subject", info_Article.Subject);
parameters[2] = new SqlParameter("@Details", info_Article.Details);
parameters[3] = new SqlParameter("@MadeOn", info_Article.MadeOn);
parameters[4] = new SqlParameter("@Person_SID", info_Article.Person_SID);
m_conn.ExecuteStoredProcedureNonQuery("spArticleUpdateBySID", parameters);
}
public override ArrayList ArticleGetAll()
{
ArrayList info_array = new ArrayList();
IDataReader reader = m_conn.ExecuteStoredProcedureReader("spArticleGetAll", null);
while (reader.Read())
{
Info_Article info = new Info_Article();
info.SID = (int) reader["SID"];
info.Subject = reader["Subject"].ToString();
info.Details = reader["Details"].ToString();
info.MadeOn = DateTime.Parse(reader["MadeOn"].ToString());
info.Person_SID = (int) reader["Person_SID"];
info_array.Add(info);
}
return info_array;
}
public override void ArticleDelete(int SID)
{
m_conn.ExecuteStoredProcedureNonQuery("spArticleDeleteBySID", new SqlParameter[] {new SqlParameter("@SID", SID)});
}
public override Info_Article ArticleGet(int SID)
{
Info_Article info = new Info_Article();
IDataReader reader =
m_conn.ExecuteStoredProcedureReader("spArticleGetBySID", new
SqlParameter[] {new SqlParameter("@SID", SID)});
if (reader.Read())
{
info.SID = (int) reader["SID"];
info.Subject = reader["Subject"].ToString();
info.Details = reader["Details"].ToString();
info.MadeOn = DateTime.Parse(reader["MadeOn"].ToString());
info.Person_SID = (int) reader["Person_SID"];
}
return info;
}
public override ArrayList ArticleGetByPerson_SID(int Person_SID)
{
ArrayList info_array = new ArrayList();
IDataReader reader =
m_conn.ExecuteStoredProcedureReader("spArticleGetByPerson_SID", new
SqlParameter[]{new SqlParameter("@Person_SID", Person_SID)});
while (reader.Read())
{
Info_Article info = new Info_Article();
info.SID = (int) reader["SID"];
info.Subject = reader["Subject"].ToString();
info.Details = reader["Details"].ToString();
info.MadeOn = DateTime.Parse(reader["MadeOn"].ToString());
info.Person_SID = (int) reader["Person_SID"];
info_array.Add(info);
}
return info_array;
}
}
}
رد: مثال على تصميم لData Tier افترض وجود Database بهذا التصميم
و ستلاحظ في الCodes استخدام Objects من نوع Info_Article و هي النقطة
التي تكلمنا عنها في شرح الDataTier في الدرس السابق عندما ذكرنا استخدام
الStrongly Typed DataSets في تخزين البيانات في الذاكرة أو عمل Class من
اختيارك لتمثيل شكل الTable و هذه الطريقة الأخيرة هي المستخدمة فقد قمت
بعمل Class تُسمى Info_Article تمثل الSchema الخاصة بالArticle Table و
كل Object منها يمثل صف واحد من المعلوماتد
و هذا هو شكل الInfo_Article Class
و هكذا يكون لكلل Table لدينا في الDatabase هذه الClasses
1- ال Base Proxy Class مثال الProxy_Article
2- ال Child Specific Class مثال الSqlProxy_Article
3- الInfo Class مثال ال Info_Article
و
كما ذكرنا الInfo_Article هي مجرد مخزن بيانات و الobject منه يماثل Row
أو صف واحد من البيانات في الDatabase من هذا النوع و هكذا يمكننا تمثيل
الQuery Result في هيئة Array of Info Objects و لهذا ستجد أن الدالة
GetAll في ال Proxy_Article الناتج منها ArrayList و هو في الحقيقة Array
of Info_Article
ثم نعود و نسأل عندما أحب أن أنشئ object من الProxy فماذا أفعل ؟؟؟
في
هذه الحالة التي يكون لديك base abstract class و مجموعة من الchild
classes و سيتم استخدام الbase class كpointer على أي من الchild objects
فان الحل دائما و أبدأً يكون استخدام الDesign Pattern الشهير Factory
و هو أن تصنع Class أخرى مهمتها انشاء الProxy Classes من النوع المطلوب و ارجاع pointer من نوع الparent class
و يكون الكود في هذه الحالة للFactory Class
حيث الCertain Condition هو الشرط الذي يحدد نوع الDatabase التي أتخاطب
معها فربما كان هذا الشرط قيمة في الRegistry أو ملف Config أو اي شئ اخر
و هكذا عندما أحتاج لاستخدام الProxy فان الكود يكون بسيط
و أخيراً قبل أن ننهي شرح الDataAccess Layer
ماذا عن الConnection String من سيكون المسؤول عنه
ببساطة
سنقوم بعمل Class اسمها Connection تحوي function واحدة فقط static و هي
GetConnectionString و تكون هذه الfunction مسؤولة عن احضار الConnection
String سواء كان مخزن HardCoded أو في ملف خارجي أو مُشفر في ملف أو في
الRegistry و يكون الكود على هذا الشكل مثلاً
و هكذا يمكننا تغيير الDatabase الخاصة بالبرنامج في ثواني بدون اللجوء الى اعادة كتابة الCode كله كل ما سيتم في هذه الحالة
كتابة
الProxy الخاص بالDatabase الجديدة و تغيير الConnection String و ستكون
الDataTier جاهزة للتعامل مع الDatabase الجديدة و لن نحتاج لتغيير سطر
واحد في الطبقات الأعلى و بفرض أن هذه الطبقة على شكل dll سيتم استبدال
الdll الخاصة بالتعامل مع الSql Server بالdll الخاصة بالOracle و ما يمكن
ببعض التفاصيل البسيطة الاستغناء عن هذا
التي تكلمنا عنها في شرح الDataTier في الدرس السابق عندما ذكرنا استخدام
الStrongly Typed DataSets في تخزين البيانات في الذاكرة أو عمل Class من
اختيارك لتمثيل شكل الTable و هذه الطريقة الأخيرة هي المستخدمة فقد قمت
بعمل Class تُسمى Info_Article تمثل الSchema الخاصة بالArticle Table و
كل Object منها يمثل صف واحد من المعلوماتد
و هذا هو شكل الInfo_Article Class
- الكود:
using System;[/b]
[b]namespace Info_Tier[/b]
[b]{[/b]
[b] public class Info_Article[/b]
[b] {[/b]
[b] private int m_SID;[/b]
[b] private string m_Subject;[/b]
[b] private string m_Details;[/b]
[b] private DateTime m_MadeOn;[/b]
[b] private int m_Person_SID;[/b]
[b] public int SID[/b]
[b] {[/b]
[b] set { this.m_SID = value; }[/b]
[b] get { return this.m_SID; }[/b]
[b] }[/b]
[b] public string Subject[/b]
[b] {[/b]
[b] set { this.m_Subject = value; }[/b]
[b] get { return this.m_Subject; }[/b]
[b] }[/b]
[b] public string Details[/b]
[b] {[/b]
[b] set { this.m_Details = value; }[/b]
[b] get { return this.m_Details; }[/b]
[b] }[/b]
[b] public DateTime MadeOn[/b]
[b] {[/b]
[b] set { this.m_MadeOn = value; }[/b]
[b] get { return this.m_MadeOn; }[/b]
[b] }[/b]
[b] public int Person_SID[/b]
[b] {[/b]
[b] set { this.m_Person_SID = value; }[/b]
[b] get { return this.m_Person_SID; }[/b]
[b] }[/b]
[b] }[/b]
[b]}
و هكذا يكون لكلل Table لدينا في الDatabase هذه الClasses
1- ال Base Proxy Class مثال الProxy_Article
2- ال Child Specific Class مثال الSqlProxy_Article
3- الInfo Class مثال ال Info_Article
و
كما ذكرنا الInfo_Article هي مجرد مخزن بيانات و الobject منه يماثل Row
أو صف واحد من البيانات في الDatabase من هذا النوع و هكذا يمكننا تمثيل
الQuery Result في هيئة Array of Info Objects و لهذا ستجد أن الدالة
GetAll في ال Proxy_Article الناتج منها ArrayList و هو في الحقيقة Array
of Info_Article
ثم نعود و نسأل عندما أحب أن أنشئ object من الProxy فماذا أفعل ؟؟؟
في
هذه الحالة التي يكون لديك base abstract class و مجموعة من الchild
classes و سيتم استخدام الbase class كpointer على أي من الchild objects
فان الحل دائما و أبدأً يكون استخدام الDesign Pattern الشهير Factory
و هو أن تصنع Class أخرى مهمتها انشاء الProxy Classes من النوع المطلوب و ارجاع pointer من نوع الparent class
و يكون الكود في هذه الحالة للFactory Class
- الكود:
[/b]
[b]public class Factory[/b]
[b]{[/b]
[b]public static Proxy_Article GetArticleProxy()[/b]
[b]{[/b]
[b]if ( certain condition)[/b]
[b]return new SqlProxy_Article();[/b]
[b]return new OracleProxy_Article();[/b]
[b]}[/b]
[b]}
حيث الCertain Condition هو الشرط الذي يحدد نوع الDatabase التي أتخاطب
معها فربما كان هذا الشرط قيمة في الRegistry أو ملف Config أو اي شئ اخر
و هكذا عندما أحتاج لاستخدام الProxy فان الكود يكون بسيط
- الكود:
Proxy_Article proxyArticle = Factory.GetArticleProxy();
و أخيراً قبل أن ننهي شرح الDataAccess Layer
ماذا عن الConnection String من سيكون المسؤول عنه
ببساطة
سنقوم بعمل Class اسمها Connection تحوي function واحدة فقط static و هي
GetConnectionString و تكون هذه الfunction مسؤولة عن احضار الConnection
String سواء كان مخزن HardCoded أو في ملف خارجي أو مُشفر في ملف أو في
الRegistry و يكون الكود على هذا الشكل مثلاً
- الكود:
public class Connection[/b]
[b]{[/b]
[b]public static string GetConnectionString()[/b]
[b]{[/b]
[b]if(certain condition)[/b]
[b]return "Data Source=(local); Database = Northwind; Integrated Security = SSPI;[/b]
[b]return "Oracle Connection String ";[/b]
[b]}[/b]
[b]}
و هكذا يمكننا تغيير الDatabase الخاصة بالبرنامج في ثواني بدون اللجوء الى اعادة كتابة الCode كله كل ما سيتم في هذه الحالة
كتابة
الProxy الخاص بالDatabase الجديدة و تغيير الConnection String و ستكون
الDataTier جاهزة للتعامل مع الDatabase الجديدة و لن نحتاج لتغيير سطر
واحد في الطبقات الأعلى و بفرض أن هذه الطبقة على شكل dll سيتم استبدال
الdll الخاصة بالتعامل مع الSql Server بالdll الخاصة بالOracle و ما يمكن
ببعض التفاصيل البسيطة الاستغناء عن هذا
مواضيع مماثلة
» جميع برامج التصميم بلغة html هنا
» هواتف مرشحة لنيل لقب أفضل الهواتف لسنة 2009 في التصميم..
» Three Tier Model Concepts, النظام ثلاثي الطبقات.. نظرة متمحصة
» تصميم فلل - منازل - جميلة جداً
» بطاقات الحروف تصميم جديد
» هواتف مرشحة لنيل لقب أفضل الهواتف لسنة 2009 في التصميم..
» Three Tier Model Concepts, النظام ثلاثي الطبقات.. نظرة متمحصة
» تصميم فلل - منازل - جميلة جداً
» بطاقات الحروف تصميم جديد
:: منتديات التصميم و البرمجة :: منتدى برمجة الألعاب والجرافيكس والتصميم :: قسم : برمجة الألعاب والجرافكس العام
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى