check home phone-call search send

آموزش مفاهیم معاری چند لایه، معماری ۳- لایه، معماری n-layer – قسمت دوم

معماری ۳ لایه و معماری n-layer

در قسمت قبلی این مقاله، مروری بر مفاهیم لایه (Layer) و  Tier داشتیم و تفاوت های آنها را ذکر کردیم، همچنین به شرح کامل لایه واسط کاربری یا همان User Interface Layer و لایه منطق کاری یا Business Logic Layer پرداختیم. در این پست لایه دسترسی به داده (Data Access Layer) را شرح می دهیم.

3. لایه دسترسی به دادهDAL

این لایه مسئول برقراری ارتباط با منبع داده و مدیریت کارهایی می باشد که نیاز به کار کردن مستقیم با داده ها را دارند. این لایه درخواست ها را از لایه BLL گرفته و داده های لازم را به شکل مناسب به آن تحویل می دهد.

این لایه نیز به دو قسمت تقسیم می شود.

 الف)   DA Components/Managers

کلاس های کار با داده ها، در این قسمت قرار می گیرند. معمولا در این قسمت پرس و جوهای اصلی کار با پایگاه داده قرار می گیرد و به ازای هر موجودیت اصلی در سیستم یک کلاس با پسوند Manager به این قسمت اضافه می شود.

 به عنوان یک استاندارد سعی کنید که در این قسمت برای متد ها از اسامی معادل با نام پایگاه داده استفاده کنید. برای مثال اگر قرار است که متدی برای دریافت اطلاعات یک کاربر داشته باشید عنوان UserManager.Select(UserId) مناسب می باشد.

ب) Data Service Gateway – DSG

اگر منبع داده یک سیستم خارجی باشد و از سرویس های آن سیستم برای دستیابی به داده ها استفاده شود، کلاس و یا متد هایی به این بخش برای تعامل با این سرویس ها اضافه می شود.

همچنین در برخی پروژه ها یک قسمت دیگر با عنوان Facade یا Factory به این قسمت اضافه می شود. وظیفه این بخش ارتباط مستقیم با پایگاه داده است و تمامی پرس وجوها به پایگاه داده در این کلاس ها تعریف می شود. فلسفه این کار هم در این است که لایه DAManager به طور کامل مستقل از تغییرات در سطح پایگاه داده می شود. برای مثال اگر نوع پایگاه داده از SQL یه Oracle تغییر کند، این لایه هیچ تغییری نمی کند چرا که این لایه تنها از متدهای بخش دیگر استفاده می کرده است.

آموزش مفاهیم معماری 3-لایه، معماری n-لایه، معماری n-tier

خاطر نشان می شویم که در پروژه های بسیار بزرگ برای غلبه بر پیچیدگی و توسعه راحت تر پروژه، باید این تقسیم بندی ها را انجام داده و تا جایی که امکان دارد باید کارها از هم جدا شوند.

در نهایت معماری توضیح داده شده در این مقاله در شکل زیر خلاصه می شود.

آموزش مفاهیم معماری 3-لایه، معماری n-لایه، معماری n-tier

برای اضافه کردن لایه دسترسی به داده در پروژه یک پوشه با عنوان DAL به پروژه اضافه کنید و به این پوشه یک کلاس با عنوان UserManager اضافه نمایید و سپس کدهای زیر را به این کلاس اضافه نمایید.

public static void Insert(UserEntity newUser){

      string strQuery = string.Format("Insert Into tblUser Values({0},{1},{2},{3},{4},);",

                                                        newUser.Id, newUser.FirstName, newUser.LastName,

                                       newUser.Email, newUser.Password);

      // insert to your db or file or any other resources

}

public static UserEntity Select(string userName, string password){

      UserEntity user = new UserEntity();

      // connect to your db and get the data

      return user;

}

public static void Delete(string userName)

      {

      // delete the user entity with userName value

}

public static void Update(UserEntity user) {

      // update the user info

 } 

فراموش نشود که فضای نام لایه Common را به این لایه نیز اضافه نمایید. شما می توانید تمامی دستورات مربوط به ADO.Net و همچنین تمامی پرس و جوهای مربوط به دسترسی به داده را در این لایه و کلاس قرار دهید. اما معمولا برای مستقل شدن کامل این لایه از تغییرات در سطح پایگاه داده، یک سطح دیگر به این لایه اضافه می شود. برای مثال می توانید یک لایه دیگر با عنوان Facade را به پروژه اضافه نمایید و در این لایه دو کلاس با نام های SqlDbms و OracleDbms تعریف نمایید و عملیات اصلی کار با پایگاه داده یعنی دستورات Select، Delete، Insert و Update خود را در قالب متدهایی در این کلاس ها تعریف نمایید و در لایه DAL تنها متدهای این لایه را فراخوانی نمایید. برای مثال کلاس SqlDbms می تواند بصورت زیر تعریف شود.

private string _connectionString;

private readonly string[] _sqlTransactionStatements;// Keep the Transact-SQL statement to process a transaction

private byte _sqlStatementsCount;

private readonly SqlDataAdapter _dataAdapter;

private readonly SqlConnection _con1;

private readonly SqlCommand _com1;

public SqlDbms(){

      const string connectionString = "your connection settings";

      _sqlTransactionStatements = new string[1000];

      _sqlStatementsCount = 0;

      _dataAdapter = new SqlDataAdapter();

      _con1 = new SqlConnection(connectionString);

      _com1 = new SqlCommand();

}

public SqlDbms(string connectionString){

      _connectionString = connectionString;

      _con1 = new SqlConnection(connectionString);

      _com1 = new SqlCommand();

}

/// <summary>

/// Execute a SELECT Transact-SQL statement and return data in a table format.

/// </summary>

/// <param name="commandText">The SELECT Transact-SQL statement.</param>

/// <returns>A System.Data.DataTable object.</returns>

public DataTable ExecuteSelectSql(string commandText){

      _dataAdapter.SelectCommand = new SqlCommand();

      _dataAdapter.SelectCommand.Connection = _con1;

      _dataAdapter.SelectCommand.CommandText = commandText;

      _dataAdapter.SelectCommand.Connection.Open();

      DataTable dt = new DataTable();

      _dataAdapter.Fill(dt);

      _dataAdapter.SelectCommand.Connection.Close();

      return dt;

}

/// <summary>

/// Execute a Transact-SQL statement.

/// </summary>

/// <param name="commandText">The Transact-SQL statement.</param>

public void ExecuteSql(string commandText){

      _con1.Open();

      _com1.CommandText = commandText;

      _com1.Connection = _con1;

      _com1.ExecuteNonQuery();

      _con1.Close();

}

/// <summary>

/// Add the Transact-SQL statement to the list and pass it to the ProcessTransaction() to build a transaction.

/// </summary>

/// <param name="sqlStatement">The Transact-SQL statement.</param>

public void AddSqlTransactionStatement(string sqlStatement){

      _sqlTransactionStatements[_sqlStatementsCount++] = sqlStatement;

}

/// <summary>

/// Process a Transact-SQL transaction to be made in a SQL server database.

/// This methode only run the Transact-SQL Insert, Delete and Update statement.

/// </summary>

public void ProcessTransaction(){

      _con1.Open();

      _com1.Connection = _con1;

      SqlTransaction st = null;

      try{

          st = _con1.BeginTransaction();

          _com1.Transaction = st;

          for (int i = 0; i < _sqlStatementsCount; ++i){

             _com1.CommandText = _sqlTransactionStatements[i];

             _com1.ExecuteNonQuery();

          }

          st.Commit();

       }

       catch (Exception msg){

           if (st != null)

               st.Rollback();

           throw new Exception(msg.Message);

       }

       finally{

       if (_con1.State != ConnectionState.Closed) _con1.Close();

           _con1.Dispose();

       _com1.Dispose();

           if (st != null)

                    st.Dispose();

        }

}

public void InsertImage(string commandText, byte[] image){

      _com1.CommandText = commandText;

      _com1.Parameters.Add("@Image", SqlDbType.VarBinary).Value = image;

      _con1.Open();

      _com1.Connection = _con1;

      _com1.ExecuteNonQuery();

      _con1.Close();

      _con1.Dispose();

      _com1.Dispose();

}

به این ترتیب شما می توانید که تمامی پرس و جو ها را در لایه DAL بسازید و آنها را برای اجرا به این کلاس تحویل دهید. همچنین میتوانید که در لایه DAL یک آرایه یا لیستی از مقادیری که می خواهید در پایگاه درج کنید را به این کلاس تحویل دهید و خود این کلاس پرس و جوی آنرا تولید کند (به عنوان یک تمرین برای فهم موضوع این کار را انجام دهید، یعنی لایه DAL تنها مقادیر را به این کلاس ارسال کند و تمامی دستورات پایگاه داده در این لایه بصورت دینامیک و با توجه به تعداد و نوع داده ها تولید شوند.).

برای طراحی Tier هر یک از لایه ها، باید به جای تعریف پوشه، یک پروژه جدید از نوع Class Library را ایجاد کنید و سپس آنرا Build کنید. و سپس dll ایجاد شده را به لیست Reference های پروژه های دیگر اضافه کنید.

طراحی لایه منطق کاری بصورت یک Tier

برای طراحی یک Tier ابتدا بر روی Solution مربوط به پروژه کلیک راست کرده و در منوی Add گزینه New Project را انتخاب نمایید. در پنجره باز شده آیتم Class Library را انتخاب کرده و عنوان BLL را به آن اختصاص دهید. سپس بر روی این پروژه کلیک راست کرده و بر طبق روش های گفته شده قبلی یک کلاس با نام UserController را به این پروژه اضافه کنید. و کدهای مرحله قبل را به این کلاس اضافه کنید. همچنین یک پروژه دیگر با عنوان Common را به Solution خود اضافه کنید و کلاس و کدهای تعریف شده در لایه Common را به این Tier اضافه کنید. سپس بر روی پروژه Common راست کلیک کرده و پروژه را Build نمایید. این کار به خاطر این است که چون خروجی این پروژه یک فایل .dll می باشد با Build کردن ایجاد شود. حال اگر به پوشه Bin مربوط به این پروژه نگاه کنید یک فایل با عنوان Common.dll ایجاد شده است. این فایل یک Tier می باشد و شما می توانید این فایل dll را به هر پروژه ای که می خواهید اضافه نمایید و از کلاس های تعریف شده در آن استفاده نمایید.  در این حالت Solution  شما باید مشابه  با شکل زیر باشد.

آموزش مفاهیم معماری 3-لایه، معماری n-لایه

برای اجرا شدن Tierمنطق کاری باید فایل .dll مربوط به Tier، Common را به این Tier اضافه نماییم. برای این کار در پروژه BLL بر روی پوشه References کلیک راست کرده و گزینه Add References را انتخاب کنید در پنجره باز شده با توجه به نسخه استفاده شده Visual Studio خود فایل Common.dll را به پروژه BLL اضافه نمایید.

طراحی لایه دسترسی به داده ها بصورت یک Tier

برای تولید Tier این لایه می توانید دقیقا همانند روش ایجاد Tier لایه BLL عمل کنید. تنها نکته ای که وجود دارد این است که به هنگام استفاده از Tier ها باید ابتدا آن Tier را Build کنید و سپس فایل dll آنرا به پروژه مورد نظر خود اضافه نمایید. نکته ای دیگر این است که در هنگام استفاده از Layer یا Tier نحوه ارجاع لایه ها به همدیگر به این شکل است که تمامی لایه ها به لایه Common دسترسی دارند. یعنی شما باید فضای نام این لایه را در تمامی کلاس ها using کنید و یا فایل dll آنرا به همه پروژه ها اضافه کنید. همچنین لایه UIL فقط با لایه Common و لایه BLL در ارتباط است و لایه BLL نیز تنها با لایه Common و لایه DAL در ارتباط است و در نهایت لایه DAL تنها با لایه Common و لایه Facade (در صورت وجود) در ارتباط است.

 مزایا و معایب معماری n-Layer

معماری 3-لایه به جز کارائی یا سرعت، تمامی موارد QoS (به پست آموزش مفاهیم معاری چند لایه، معماری 3- لایه، معماری n-layer – قسمت اول رجوع کنید)را دارد. که این هم به خاطر وجود لایه های زیادی است که تعریف می شوند.

مهمترین مزیت معماری n-لایه غلبه بر پیجیدگی نرم افزار های بزرگ و استقلال قسمت ها می باشد. همچنین به علت وجود این لایه ها، هر لایه می تواند مکانیزم های امنیتی خاص خود را داشته باشد و بدین ترتیب فرآیند امنیت افزایش می یابد.

معماری 3-لایه معمولاً به دلیل وجود کلاس های بسیار زیاد برای طراحی و توسعه پروژه های کوچک مناسب نمی باشد.

دانلــود بـاکـــس

لینک های دانلود در این باکس قرار دارد
img

جهت مشاهده لینک های دانلود ابتدا وارد شده یا ثبت نام کنید

Avatar
پشتیبان سورس ایران 2180 مطلب منتشر شده

در مجموعه سورس ایران سعی می کنیم علاوه بر آموزش برنامه نویسی، به مسائل مرتبط و مهارت های نرم بپردازیم تا بعدهای مختلف را پوشش دهیم.

دیدگاه کاربران

تعداد دیدگاه های کاربران : ۰ دیدگاه
هنوز دیدگاهی ارسال نشده است.


شما با موفقیت در خبرنامه ما عضو شدید