# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WCF , Web Services , .Net Remoting >  پیاده سازی یک پروژه ساده با معماری لایه ای از ابتدا تا انتها

## Rejnev

به نام خدا
 در این مقاله قصد دارم یک برنامه ساده توسط معماری لایه ای از ابتدا تا انتها پیاده سازی کنم.قبل از هر چیز به موارد زیر نیاز داریم:
 -visual studio یکی از نسخه های 2003 به بعد
 -یک موتور بانک اطلاعاتی SQL از هر نسخه ای (2000,2005,2008)(express,enterprise,…) امکانات فعلی برنامه شامل موارد زیر می شود -امکان Login کاربر -مشاهده یکسری اطلاعات در Grid View -امکان حذف اطلاعات از ردیف انتخاب شده در Grid View -امکان ویرایش ردیف انتخاب شده -جستجوی اطلاعات Grid View -ثبت یک رکورد جدید *این برنامه صرفا جنبه مثالی دارد و بهینه سازی و تکمیل کدها به خواننده واگذار شده است. **سورس برنامه به همراه فایل آموزش در نهایت ضمیمه خواهد شد.
* هدف کلی معماری لایه ای تقسیم و دسته بندی کارها در قالب یک لایه است. در این معماری ما سه لایه Interface, Logic, DataAccess داریم. -لایه DataAccess وظیفه ارتباط برقرار کردن با بانک اطلاعاتی و اجرای دستوراتی که به آن میدهیم را دارد. -لایه Logic وظیفه ایجاد قوانین و منطق برنامه را دارد. مثلا در مثال اداره آموزش یک دانشجوی مشروطی نمیتواند بیش از 14 واحد درس انتخاب کند. بدیهی است که این قوانین در شرایط مختلف متفاوت است. در نتیجه این وظیفه لایه Logic است تا به عنوان مغز متفکر سیستم عمل کند. -لایه آخر Interface می باشد. این لایه مربوط به رابط کاربری برنامه است. طراحی فرم ها و گزارشات و ... در این لایه قرار می گیرد. با فرض این که خواننده با معماری لایه ای آشنایی دارد به ادامه مبحث می پردازیم. با توجه به امکاناتی که در بالا گفته شد جداول زیر متصور است جدول کاربران: -نام کاربر -رمز عبور یک جدول دلخواه دیگر مثلا جدول کالا: -کد کالا -نام کالا -کمپانی سازنده -قیمت دستورات زیر را برای ساخت دیتابیس و جداول بالا بکار بگیرید 
Create database dataSample
go
use dataSample
go
Create table users
(
    code    smallint primary key identity(1,1),
    name    nvarchar(50) not null,
    pass    nvarchar(50) not null
)
go
Insert into users(name,pass)values('admin','1')
go
Create table product
(
    code    int primary key identity(1,1),
    name    nvarchar(50) not null,
    company    nvarchar(50),
    price    float not null
)
insert into product(name,company,price)values('Cpu','AMD',6000  0)
insert into product(name,company,price)values('Cpu','Intel',70  000)
insert into product(name,company,price)values('Graphic 9500','Geforce',80000)
insert into product(name,company,price)values('Ram 1GB','Kingmax',24000)
insert into product(name,company,price)values('Hard 500GB','Maxtor',54000)

 *ادامه پروژه منوط به ساخت دیتابیس بالا می باشد. در نتیجه کافیست دیتابیس را به هر نحوی ایجاد کنید و موقتا یک کاربر به جدول کاربران و در صورت تمایل تعدادی کالا هم اضافه کنید. *به خاطر پیچیده نشدن و طولانی نشدن مقاله از ساخت view و SP و ... پرهیز می کنم. در پیاده سازی برنامه های چند لایه ای معمولا بجز لایه رابط کاربر سایر لایه ها بصورت کتابخانه های dll پیاده سازی می شوند. برای ساخت چنین برنامه هایی در محیط VS بصورت زیر عمل میکنیم: در محیط ویژوال استودیو یک پروژه Windows application ای با نام dataSample ایجاد میکنیم.بعد از ایجاد معمولا Visual studio یک فرم آماده به ما تحویل می دهد.

 
*ساخت Login برای برنامه*
در پنجره Solution Explorer نام فرم ایجاد شده را به frmLogin تغییر دهید. فرم Login را بصورت زیر طراحی میکنیم:

 حالا یک فرم در لایه رابط ایجاد شد. ساخت سایر لایه ها: قرار است که کاربر رمز عبور خود را وارد کرده و بعد از زدن کلید ورود در صورت معتبر بودن رمز به صفحه اصلی منتقل شود.در نتیجه روال کار بطور کلی به صورت زیر خواهد بود: -رمز به یک تابع فرستاده میشود -یک کوئری نوشته شده که بر اساس آن از جدول  کاربران شخصی انتخاب میشود که دارای رمز عبور وارده است. -در صورت وجود شخص، Login صورت میگیرد و در غیر این صورت پیغام مناسب نمایش داده میشود. از سناریوی بالا کارهای زیر استنباط میشود: -خواندن اطلاعات از دیتابیس (نوشتن کوئری) -تصمیم گیری بر طبق اطلاعات خوانده شده (کاربری وجود دارد یا خیر) -واکنش نهایی (منتقل شدن به فرم اصلی و یا پیغام خطا) حال با این دیدگاه لایه ای ایجاد میکنیم که تصمیم گیری را انجام دهد (Logic) در منوی File گزینه Add و سپس add new project را انتخاب میکنیم.
 طبق تصویر پروژه را با نام Logic به Solution اضافه می کنیم.  همانطور که میبینید این نوع از پروژه ها فایل DLL  به عنوان خروجی تحویل میدهند.


در پنجره Solution Explorer در لایه Logic که هم اکنون ایجاد شد نام Class1 را به نام Business.cs تغییر دهید. بعد از تغییر نام پیغامی که ظاهر می شود را Yes کنید تا نام کلاسی که در داخل محتویات Class1 بود نیز تغییر پیدا کند.
حالا از آنجایی که هر لایه فقط میتواند با لایه پایین تر از خود در ارتباط باشد باید ارتباط لایه Interface را با لایه Logic برقرار کنیم. تصویر زیر را ملاحظه کنید:




یک Reference برای لایه رابط اضافه کردیم. Reference از میان Project های Solution انتخاب شده. با این کار در واقع گفتیم که لایه رابط تنها می تواند با لایه منطق ارتباط برقرار کند. حالا از درون لایه رابط میتوانیم توابع لایه منطق را فراخوانی کنیم.
در ادامه به سراغ بقیه کار خواهیم رفت

----------


## Rejnev

قرار است یک متد برای اعتبار سنجی ایجاد کنیم، پس کلاس Business را باز کرده و متد زیر را برای کلاس می نویسیم:
public static bool Login(string password)
{
} به خاطر زیاد بودن تعداد رجوعات به لایه ها متدهای کلاسها را Static در نظر میگیریم تا نیازی به ساخت یک شیئ از نوع آن کلاس نباشد. بدیهی است که در این روش نیاز به رعایت دقت بیشتری در برنامه نویسی است.
متد Login نیاز به اطلاعات از بانک دارد پس باید اطلاعات از بانک خوانده شده و در صورت وجود شخص با چنین رمزی ورود صورت گیرد. از آنجایی که خواندن اطلاعات در لایه DataAccess صورت می گیرد لایه را ایجاد می کنیم. مراحل ایجاد همانند لایه قبلی (Logic) است. نام لایه را DataAccess و نام کلاس درون آن را Access بنامید. و به Reference های لایه منطق DataAccess را اضافه کنید. تا این لحظه Solution Explorer باید شکل زیر را نمایش دهد





این لایه تنها وظیفه خواندن و نوشتن در بانک را دارد. اما از آنجایی که ممکن است متدهای درون آن زیاد شوند و تعداد دستورات برای ایجاد اتصال به بانک در این لایه نیز افزایش پیدا کند لذا برای افزایش انعطاف پذیری یک لایه دیگر تحت عنوان Database با یک کلاس به نام Execute به پروژه اضافه می کنیم. و یک  Referenceبه لایه دیتابیس برای لایه دسترسی به داده اضافه می کنیم.



حالا برنامه دارای چهار لایه شد.
-لایه database یک دستور SQL را از لایه DataAccess گرفته و اجرا میکند
-لایه DataAccess یک دستور SQL را بر طبق نیاز لایه Logic ایجاد میکند و برای اجرا به لایه Database ارسال میکند.
-لایه Logic تقاضای اطلاعات از لایه DataAccess می کند.
-لایه Interface تقاضاهای خود را به Logic ارسال میکند.
در متد Click مربوط به کلید ورود در لایه Interface کد زیر را مینویسیم


private void btnLogin_Click(object sender, EventArgs e)
{
    if (Logic.Business.Login(txtPassword.Text) == true)
    {
        //goto main menu
    }
}
بدیهی است که اگر فضای نام Logic را به ابتدای فرم اضافه کنیم نیازی به نوشتن Logic در ابتدای دستورات نمی باشد.
متد Login لایه منطق اجرا میشود و دو حالت true,false بر میگرداند. درصورت درستی دستورات داخل شرط اجرا شده به صفحه اصلی منتقل میشویم.
معمولا کنترلی که در این لایه صورت میگیرد میتواند این باشد که کاربر مثلا مقدار خالی را به لایه منطق ارسال نکند. با گذاشتن یک شرط در ابتدای متد کلیک این بررسی را میتوان انجام داد.
حالا لایه منطق باید تصمیم گیری کند که true برگرداند یا false.

به لایه database میرویم. در این لایه دو متد به نام های executeNone و executeRead در کلاس Execute ایجاد میکنیم. متد اول یک دستورSQL  را گرفته و فقط اجرا میکند و تعداد رکوردهایی که تحت تاثیر دستور قرار گرفته اند را برمیگرداند. متد دوم یک دستور را گرفته و بعد از اجرا یک DataTable بر میگرداند.
 محتویات کلاس Execute به این صورت است
 using System.Data;
using System.Data.SqlClient;

namespace Database
{
    public class Execute
    {
        static string cnn = "Data Source=.;Initial Catalog=dataSample;Integrated Security=True";
        static SqlConnection conection = new SqlConnection(cnn);
        static SqlCommand cmd = new SqlCommand("", conection);
        static SqlDataAdapter da = new SqlDataAdapter(cmd);
        public static int executeNone(string sql)
        {
            conection.Open();
            cmd.CommandText = sql;
            int a = cmd.ExecuteNonQuery();
            conection.Close();
            return a;
        }
        public static DataTable executeRead(string sql)
        {
            DataTable dt = new DataTable();
            da.SelectCommand.CommandText = sql;
            da.Fill(dt);
            return dt;
        }
    }
}
در لایه DataAccess و در کلاس Access متد Login را بصورت زیر مینویسیم:using System.Data;

namespace DataAccess
{
    public class Access
    {
        static string q = "";
        public static DataTable Login(string password)
        {
            DataTable dt = new DataTable();
            q = "select * from users where pass='" + password + "'";
            dt = Database.Execute.executeRead(q);
            return dt;
        }
    }
}

 
متد Login یک کوئری ایجاد و برای اجرا و دادن خروجی به Database ارسال میکند. خروجی حاصل نیز به عنوان یک جدول به لایه Logic ارسال خواهد شد.
محتویات لایه Logic، کلاس Business:

using System.Data;

namespace Logic
{
    public class Business
    {
        public static bool Login(string password)
        {
            DataTable dt = new DataTable();
            dt = DataAccess.Access.Login(password);
            if (dt==null)
            {
                return false;
            }
            if (dt.Rows.Count > 0)
            {
                return true;
            }
            else
                return false;
        }
    }
}
خروجی جدولی که از لایه DataAccess می آید را پردازش میکند و در نهایت یک مقدار را به لایه رابط بر میگرداند.
حالا لایه رابط را تکمیل میکنیم.

----------


## Rejnev

یک فرم با نام frmMain به برنامه اضافه میکنیم و رویداد Click مربوط به کلید ورود در فرم frmLogin را تکمیل میکنیم: 


   private void btnLogin_Click(object sender, EventArgs e)
   {
       if (Logic.Business.Login(txtPassword.Text) == true)
       {
           frmMain f = new frmMain();
           f.Show();
           Hide();
       }
       else
       {
          MessageBox.Show("رمز عبور اشتباه است");
       }
   }
و در نهایت برای تکمیل برنامه در رویداد FormClosed مربوط به frmMain مینویسیم


private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
      Application.Exit();
}

به این ترتیب یک سناریو برای ورود کاربر به برنامه با استفاده از معماری لایه ای نوشتیم.

سناریوی بعدی
*-نمایش اطلاعات در Grid View*
دقت داشته باشید که معمولا برای انجام هر کاری در نرم افزار نیاز به نوشتن یک متد در لایه Logic هست. برای نمایش اطلاعات جدول کالا در Gird در لایه DataAccess متد GetProducts را به صورت زیر می نویسیم که در خروجی یک DataTable بر می گرداند.


 public static DataTable GetProducts()
{
DataTable dt = new DataTable();
      q = "select * from product";
      dt = Database.Execute.executeRead(q);
      return dt;
}
متد بالا اطلاعات را در قالب یک جدول از لایه database خوانده و در dt می ریزد و جدول را بر می گرداند.
حالا می توانیم در لایه Logic متدی نوشته که یک جدول برای نمایش در Grid بر گرداند. پس در لایه منطق متد زیر را اضافه می کنیم:


public static DataTable GetProducts()
{
    DataTable dt = new DataTable();
    dt = DataAccess.Access.GetProducts();
    return dt;
}
و در نهایت داخل لایه رابط در فرم frmMain این کدها را اضافه می کنیم


DataTable dt = new DataTable();
protected void showProducts()
{
    dt = Logic.Business.GetProducts();
    DG.DataSource = dt;
}

private void btnShowProducts_Click(object sender, EventArgs e)
{
    showProducts();
}

کد بالا شامل یک متد که اطلاعات را در Grid بریزد و یک کلید که متد را فراخوانی کند می باشد. شکل frmMain بصورت زیر باید طراحی شود:



شامل یک کلید و یک DataGridView که نام آن را به DG تغییر داده ام.
علت این که در قسمت کد این فرم یک DataTable بصورت سراسری تعریف کردم این است که بعدا برای جستجوی اطلاعات از آن استفاده خواهیم کرد.
سناریوی نمایش اطلاعات در Grid به اتمام رسید. حالا نوبت جستجوی اطلاعات هست.

----------


## Rejnev

*جستجوی اطلاعات داخل Grid View*
جستجوی اطلاعات را میتوان در همین لایه انجام داد. کافیست اطلاعات داخل dt که در بالا بصورت سراسری تعریف کردیم را فیلتر کنیم. برای شروع یک TextBox و یک کلید برای جستجو روی فرم اضافه کنید. همچنین میتوانید یک DropDown اضافه کنید تا بتوان نوع جستجو را مشخص کرد.
مانند زیر:



کد زیر را هم در رویداد کلیک مربوط به کلید جستجو می نویسیم:


private void btnSearch_Click(object sender, EventArgs e)
{
    if (dt==null)
    {
        return;
    }
    if (txtSearchKey.Text == "")
    {
        dt.DefaultView.RowFilter = "";
    }
    else
    {
        switch (drpSearch.Items[drpSearch.SelectedIndex].ToString())
        {
            case "name":
                dt.DefaultView.RowFilter = "name like '%" +
                    txtSearchKey.Text + "%'";
                break;
            case "company":
                dt.DefaultView.RowFilter = "company like '%" +
                    txtSearchKey.Text + "%'";
                break;
            case "price":
                dt.DefaultView.RowFilter = "price =" +
                    txtSearchKey.Text;
                break;
        }
    }
    DG.DataSource = dt;
}

 این هم از یک جستجوی ساده Grid View. سناریوی بعدی افزودن کالا به جدول بانک اطلاعاتی.

----------


## Rejnev

*افزودن رکورد به جدول بانک اطلاعاتی*
برای این بخش نیاز به یک فرم دریافت اطلاعات و یک متد در لایه منطق و یک متد در لایه دسترسی به داده داریم.
قرار است اطلاعات کالا به عنوان آرگومان ورودی به لایه منطق ارسال شود. پس ابتدا در لایه DataAccess متد زیر را می نویسیم:


public static int AddProduct(string name, string company, float price)
{
    q = "insert into product(name,company,price)values('" +
        name + "','" + company + "'," + price + ")";
    int a = Database.Execute.executeNone(q);
    return a;
}

 و در لایه منطق متد زیر را اضافه می کنیم:


 public static bool AddProduct(string name, string company, float price)
{
    if (DataAccess.Access.AddProduct(name, company, price) > 0)
    {
        return true;
    }
    return false;
}
 حالا به لایه رابط رفته و فرم را طراحی می کنیم. یک کلید برای باز کردن فرم ثبت کالا و یک فرم با طراحی زیر برای دریافت اطلاعات کالا مورد نیاز است:



 در رویداد کلیک مربوط به کلید ثبت کد زیر را می نویسیم:


 private void btnAdd_Click(object sender, EventArgs e)
{
    if (txtName.Text=="")
    {
        MessageBox.Show("نام کالا را وارد کنید");
        return;
    }
    if (txtCompany.Text == "")
    {
        MessageBox.Show("نام شرکت را وارد کنید");
        return;
    }
    float f;
    if (float.TryParse(txtPrice.Text,out f)==false)
    {
        MessageBox.Show("قیمت را درست وارد کنید");
        return;
    }
    if (
            Logic.Business.AddProduct
            (
                txtName.Text,
                txtCompany.Text,
                float.Parse(txtPrice.Text)
            )==true
        )
    {
        Close();
    }
    else
    {
        MessageBox.Show("خطا در ثبت اطلاعات");
    }
}

 کد بالا ابتدا یک اعتبار سنجی از اطلاعات کرده و سپس متد ثبت کالا در لایه منطق را فراخوانی می کند. ثبت هم به اتمام رسید. برای حذف کافیست یک کد به لایه منطق فرستاده شود و بعد در لایه دسترسی به داده دستور حذف رکورد اجرا شود. ویرایش اطلاعات هم به همین صورت انجام خواهد شد. و به عهده خواننده گذاشته می شود.

 *به ترتیب فایل اسکریپت ساخت دیتا بیس و پروژه و متن مقاله بصورت PDF در ضمیمه موجود است*
  از صبر و حوصله شما سپاسگذارم. با تشکر محمد باقرانی

----------


## Arman Mohamadi

اگه امکانش هست یک برنامه C#‎ با SQL2000 اگه دارین همراه با document هاش کامل به فارسی دارین برام بفرستین ازتون میخرم شماره حساب بدین.
میخوام یه برنامه application ی باشه مثلا برنامه یک فروشگاه یا حسابداری باشه که بعدا بتونم از روی اون برنامه دیگه بسازم.خودم سایت نوشتم منتها فرم applicationی ننوشتم نمیدونم دستور اتصالش به پایگاه داده چطوره.
اگه لطف کنین یه برنامه که درج و حذف و نمایش بانگ اطلاعات و ورود افراد login و ... توش باشه.ممنون

----------


## Arman Mohamadi

آقای باقرانی با سلام.
راستش من تازه ترم اول کارشناسیم هیچی از معماری و اینا بلد نیستم.
من از روی pdf پیش رفتم پایگاه هم درست کردم منتها تو dataTable  خطا میده نمیدونم چیکار کنم.
تا جایی که میدونم فقط خطاهام در رابطه با dataTable هستش.
من پروژم رو واستون میفرستم اگه امکانش هست زحمت بکشید مشکلشو برطرف کنید. اگه شماره تماس هم بذارین تا مستقیم باهاتون تماس بگیرم ممنون میشم.
در ضمن اگه یکی از پروژه هاتون رو با C#‎ و SQL 2000 همراه با راهنمای گام به گام و کاملآ واضح برام بفرستین ازتون میخرم.
با سپاس و تشکر فراوان.

----------


## Rejnev

با سلام



> من تازه ترم اول کارشناسیم هیچی از معماری و اینا بلد نیستم


طوری که از استادمون پرسیدم این مطالب مربوط به دوره ارشد میشه. پس ناراحت نباشید.

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



> این برنامه صرفا جنبه مثالی دارد و بهینه سازی و تکمیل  کدها به خواننده واگذار شده است.


اگه در سورس کدها دقت کنید میبینید که  مثلا از هیچ بلوک try Catch ای استفاده نکردم.
پس اگه طبق آموزش پیش رفتید و در قسمتی به خطا بر خوردید باید خودتون زحمت رفعش رو بکشید.
احتمالا در قسمت connection string یا بعضی خطا های جزئی به مشکل برخوردید که اگه بتونید متن خطا رو بگید بهتر و راحت تره.
در مورد پروژه هم همون پیغامی که قبلا دادم جوابم هست و منتظر جواب شما هستم.

----------


## saeedr22

احساس می کنم بعضی جاها کدهای لایه ی bll  رو تو dataaccess  نوشتین.

----------


## ghuoloomi

سلام و عرض خسته نباشید.
مطلب مفید و جالبی بود. ممنون
فقط یه خطایی از برنامه می گیره که عکسشو واستون می ذارم .. لطفا راجبش توضیح بدین.. ممنون میشم.

----------


## Rejnev

> سلام و عرض خسته نباشید.
> مطلب مفید و جالبی بود. ممنون
> فقط یه خطایی از برنامه می گیره که عکسشو واستون می ذارم .. لطفا راجبش توضیح بدین.. ممنون میشم.


سلام
در پست 2 و در تگ کد سوم، کدی به این شکل نوشته شده که connectionString یا همون رشته اتصال به sql رو مشخص میکنه.
شما باید توی سیستم خودتون Connection خودتون رو بدید.
این کد منظورم هست:

 public class Execute
    {
        static string cnn = "Data Source=.;Initial Catalog=dataSample;Integrated Security=True";
...

برای به دست آوردم Connection String اگه  از نسخه sqlExpress استفاده میکنید که باید یک فایل دیتا بیس به پروژه اضافه کنید و جدول ها رو در اون بسازید(در خود VisualStudio). و اگر غیر express هست نیازی به افزودن فایل نیست. فقط بایددر sqlServer دیتابیس جدید ایجاد کنید و در اونجا دیتابیس بسازید.
حالا میرسیم به Connection String. توی نسخه های مختلف زیاد فرق نمیکنه.
فقط برای Express نیازی به طی ویزارد Connect To  Database در پنجره Server Explorer که در لینک زیر آوردم نیست. چون بعد از اضافه کردن فایل دیتابیس به پروژه خود به خود به پنجره مذکور اضافه میشه و شما فقط کافیه در Properties مقدار ConnectionString رو کپی کنید
این لینک توضیح داده(پست 10 به بعد)
*اتصال به sql در C#‎‎*

----------


## ghuoloomi

سلام خودم جوابشو پیدا کردم... در کلاس  Execute به جای کد static string cnn = "Data Source=.;Initial Catalog=dataSample;Integrated Security=True";   از این کد استفاده کنید : 
staticstring cnn=@"Data Source=ADMINISTRATOR\SQLEXPRESS;Initial Catalog=dataSample;Integrated Security=True";
 
دلیلش هم اینه که SQL SERVER  رو نصب ندارین..

----------


## ghuoloomi

آقای باقرانی دوباره سلام ..
 من جواب شما رو ندیده بودم واسه همین پست بالا رو نوشتم.. به هر حال ممنون از پیگیریتون و مطلب خیلی زیبایی بود..

فقط یه سوال دارم.. این که با چه متدی میشه به یه سلول از data table دسرسی پیدا کرد؟؟؟

----------


## Rejnev

> فقط یه سوال دارم.. این که با چه متدی میشه به یه سلول از data table دسرسی پیدا کرد؟؟؟


سلام
خواهش میکنم

...
DataTable dt=new DataTable
...
da.fill(dt);
...
// for example row  10 and col 1:
this.Text=dt.Rows[10][1].ToString();
//row 5 and col 3:
this.Text=dt.Rows[5][3].ToString();
...

----------


## ghuoloomi

سلام.
ممنون.

----------


## اَرژنگ

با تشکر از زحماتتان،
در مورد کدهایی که برایه مثال استفاده شده، میشه یکمقداری ببهبودشان داد ، من یک مثال ساده در اینجا فرستادم :https://barnamenevis.org/showth...137#post952137
ازش برایه  بهبود این مقاله خوبی که نوشتید استفاده کنید.

روش فرم لگینتان را هم توصیه میکنم عوض کنید، روش قایم کردن فرمها توصیه نمیشه.

----------


## Rejnev

> با تشکر از زحماتتان،
> در مورد کدهایی که برایه مثال استفاده شده، میشه یکمقداری ببهبودشان داد ، من یک مثال ساده در اینجا فرستادم :https://barnamenevis.org/showth...137#post952137
> ازش برایه  بهبود این مقاله خوبی که نوشتید استفاده کنید.
> 
> روش فرم لگینتان را هم توصیه میکنم عوض کنید، روش قایم کردن فرمها توصیه نمیشه.


با تشکر.
آره، خودم هم میدونم کدها به درد نمیخورن. فقط برای مثال و نشون دادن معماری در قالب مثال نوشتمشون. فرم لاگین و ذخیره پسورد به این صورت هم کلا مورد داره.
در کل در پست اول هم گفتم بهینه سازی و ... به عهده خواننده است. ان شاء الله یک روزی یک مقاله دیگه خواهم نوشت که کلا این مقاله رو نقض کنه.

----------


## اَرژنگ

> با تشکر.
> آره، خودم هم میدونم کدها به درد نمیخورن. فقط برای مثال و نشون دادن معماری در قالب مثال نوشتمشون. فرم لاگین و ذخیره پسورد به این صورت هم کلا مورد داره.
> در کل در پست اول هم گفتم بهینه سازی و ... به عهده خواننده است. ان شاء الله یک روزی یک مقاله دیگه خواهم نوشت که کلا این مقاله رو نقض کنه.


کی گفته بدرد نمیخورند! از ۹۰ درصد کدهایی که فرستاده شدند بهترند، در ضمن اصل مطلب کد نبود اینکه لایه‌بندی شدند مهمه، مقاله و شروع خوب است ، همیشه میشه برایه همه‌چی اشکال پیدا کرد، مهم این است که اشکال را برایه بهبودی استفاده کنید.
این مقاله در آینده نقظ نخواهد شد، بلکه فقط بهبود پیدا خواهد کرد، همانطوری که ما همیشه رو کدهامان کار میکنیم همین مقاله را هم میتوانید ورژن بندی کنید، به این شکل پیشرویش را به حالت زنده میبینید.
کار به این خوبی به بهبود دادن میارزه، قبل از اینکه بگیم کدهاش بدرد نمیخورند به این نقاط توجه کنید:
۱.خصوصیاتی را که یک برنامه ۳ لایه باید داشته باشد دارد؟ به نظر من بله
۲.کار میکنه ؟ بله
۳. من مقاله و یا کار دیگری در این مورد به کاملی و سادگی این مقاله شما ندیدم، قبل از اینکه بگیم بدرد نمیخوره اول باید یک چیزی که  بدرد خوره را نشان بدیم. 

برایه تازه کارها همین مقاله ۹۰۰٪ بهتر از نقته شروعیست که هم جا دارند.  یک اصلوبی را با توضیح پایه‌گذاری کرده، تا اینکه هر جایی که به بنده‌هایه خدا میگند این کلاس ، این اینترفیس بعدش میسپرنشان به امان خدا.

همه چی به بهبودی نمیارزه ولی این مقاله حتماً به بهبودی میارزه.

----------


## Rejnev

خیلی ممنون.
به زندگی امیدوارم کردین. :قلب: 
من کاری نکردم. فقط همون چیزی رو که سر کلاس استادمون بهمون یاد داد رو اینجا نوشتم.
البته چند روزی رو برای تایپ و جمع بندیش وقت گذاشتم. اول خواستم فقط فایل آموزش رو ضمیمه کنم. ولی با مشورت بهم گفتن بهتره خود مطلب رو هم بذاری.
نمونه مثالهای خوب هم زیاد پیدا میشه که پروژه رو با این معماری نوشتن
مثالش لینک خودتون(البته چون دات نت 4 بود نتونستم بازش کنم) یا این  و  این که یکی از دوستان ایمیل کرد.
در کل برای روی آوردن به این معماری نباید به این مقاله اکتفا کرد و باید مطالعه زیادی انجام داد و جوانب و آینده کار رو در نظر گرفت.
مثلا استفاده از sp ها در دیتابیس یا linq که عدم استفاده از اون ها(حداقل sp ها) در برنامه حماقته.یا برای مدیریت پیغام هایی که باید به کاربر نمایش داده بشه که خودش یک نوع پاس دادن به interface رو میطلبه یا در بخش دسته بندی کلاس ها در هر لایه و این که لازم نیست تمام متد های یک لایه در فقط یک کلاس در اون لایه نوشته بشن و مسائل دیگه ای که باید قبل از پیاده سازی به این روش بررسی بشن.

----------


## Saber_Fatholahi

دوست من کارت جالبه و جای تقدیر داره اما توی بعضی از قسمتها خیلی کارتون ابتدایی بود جسارت نشه  فقط خواستم اشکارلاشو بگم
مثلا از پارامترها توی SQL استفاده نکردین و این می تونه برای برنامه خیلی خطرناک باشه
موفق باشید

----------


## مهدی عابدینی

در ایجاد پایگاه داده خود دقت کنید

----------


## Hsn.Zare

سلام . ضمن تشكر از شمادوست عزيز . چند تا سوال زير رو از حضورتون داشتم :
1- علت اينكه دو تا پروژه جداگانه براي Database , Access نوشتين چيه؟ چرا ادغام نكردين اينها رو
2- اگر يه برنامه بزرگتر مثلا 20 فرمي داشته باشيم آيا فكر نمي كنين حجم كلاس Bussines خيلي زياد ميشه؟
مشكل واقعي وقتي به وجود مي آيد كه اين فرم ها به صورت گروهي زده شوند آيا مديريت اين كلاس سخت نيست وقتي 5 نفر هم زمان بخوان اون روتغيير بدن؟
3-اگر استراتژي ذخيره داده ها عوض شود مثلا به جاي ديتابيس از XML استفاده شود دقيقا كدام لايه بايد عوض شود ؟ DataAccess يا DataBase يا هر دو ؟

----------


## Rejnev

با تشکر از زارع عزیز
حقیقت عمر اینه که این روشی که من کد زدم تقریبا منسوخه و دیگه خودم هم این روش رو قبول ندارم.
تازه رسیدم به جنریک و لینک و ...
1- اون لایه کوچولوی دیتابیسی که نوشتم رو میشد توی همون اکسس هم نوشتش. زیاد سخت نگیرید.
2-برای پروژه بزرگ هم قطعا باید از یک الگو استفاده کرد و نه اینکه برای هر کاری یک متد و کلاس بنویسیم.
یعنی تا جای ممکن با یک تغییر کوچیک باید کاری کرد که کارهای تکراری حذف بشه  تا کد کوتاه بشه. توضیحش نیاز به مثال داره.
3-هر دو.
همونطور که گفتم و قبلا هم گفته بودم این روش کد نویسی منسوخه و فقط جنبه مثالی داشت

----------


## moslem.hady

> با تشکر از زارع عزیز
> حقیقت عمر اینه که ای....


اولا بايد بگم حقيقت امر درسته ، نه حقيقت عمر!!!!! :لبخند: 

و نكته ديگه اينكه همونطور كه خودتون گفتين، اين روش خيلي قديميه! مثلا به نظر من لايه dataBase شما زياده. يني شما درست اسفاده نكردين!! معمولا از اين لايه براي افزايش سرعت خوندن اطلاعات اسفاده ميسه. مثل cache. و شما ميتونستين كلاسي كه در لايه DataBase اشفه كردين رو در لايه DAL اضافه كنيد.
بهرحال هركس يه جور كار ميكنه ديگه! 
باتشكر از آموزش خوبتون!

----------


## araz_pashazadeh

با عرض سلام و خسته نباشید خدمت دوستان
من قبلا یک برنامه 3لایه از یکی از دوستان گرفته بودم که در داخل برنامه فایلهای با پسوند dal و bll وجود داشت از ایشون پرسیدم اینها جه فایلهای هستن چه معنی میدن؟
گفتن لایه های برنامه هستن و توضیح بیشتری ندادن.
لطفا در این ضمینه بیشتر توضیح بدین و راهنمایی کنین که این لایه ها را چطوری میشه به یک پروژه اضافه کرد؟

----------


## hamedjon

اشکال از ما نیست کتابها و سایتها و اساتید بی سواد با این روش یاد دادن ای کاش یکی پیدا بشه معماری 3لایه را یاد بده همه مشکل داریم من از همه دوستان بیشتر 
 :گریه:  :ناراحت:

----------

