PDA

View Full Version : اصول برنامه نویسی 3 لایه چگونه است؟



farshadvl
چهارشنبه 05 بهمن 1401, 19:18 عصر
با سلام و عرض ادب
من میخام برنامه نویسی ۳ لایه رو اصولی یاد بگیرم.به همین منظور اومدم یک جدول توی sql سرور ایجاد کردم و یک جدول ساختم و از طریق یک ویندوز فرم میخام دیتای اون رو بروزرسانی و واکشی کنم . من ۲ تا لاس درست کردم یکی بریا دیتالایر و یکی هم برای بیزنس که کدهاش رو در پایین میزارم.من میخام بدونم این روشی که انچام دادم درست هست یا نه؟ کلا توی دیتالایر و بیزنس کلاس من کدهام درست قراردادم یا خیر؟ لایه نمایش یا همون ویو همون فرم های ما هست یا باید برای اون هم کلاس ساخت؟ ممنون میشم منو راهنمایی کنید

دیتالایر :

internal class DocumentDAL
{
private SqlConnection conn = new SqlConnection("Server=SQLSERVER.1;Integrated Security=SSPI;Persist Security Info=False;User ID=kiansaze;Initial Catalog=Karjoo;Data Source=DESKTOP-UKJISPV");
internal int DocID;
internal int DocRev;
internal string DocTitle;


public DataTable Select()
{
string sqlcommand = "select * from Document";
SqlDataAdapter da = new SqlDataAdapter(sqlcommand, conn);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}


public int Add()
{
string query = "insert into Document values(@doctitle,@docrev)";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@doctitle", this.DocTitle);
cmd.Parameters.AddWithValue("@docrev", this.DocRev);
int result = cmd.ExecuteNonQuery();
return result;
}
public int Update()
{
string query = "update Document set doctitle = @doctitle,docrev=@docrev where docid = @docid";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@docid", this.DocID);
cmd.Parameters.AddWithValue("@doctitle", this.DocTitle);
cmd.Parameters.AddWithValue("@docrev", this.DocRev);
int result = cmd.ExecuteNonQuery();
return result;
}
}


لایه بیزنس :
internal class DocumentBLL {
private DocumentDAL _docDal ;


public int DocID { get; set; }
public int DocRev { get; set; }
public string DocTitle { get; set; }


public DataTable Select()
{
_docDal = new();
return _docDal.Select();
}


public bool Add()
{
_docDal = new();
if (_docDal.Add() > 0)
return true;
else
return false;


}
public bool Update()
{
_docDal = new();
if (_docDal.Update() > 0)
return true;
else
return false;
}





}

فرم ورودی کاربر :
public partial class Form1 : Form {
public Form1()
{
InitializeComponent();
}


private void btnAdd_Click(object sender, EventArgs e)
{
DocumentBLL documentBLL = new DocumentBLL();
documentBLL.DocTitle = txtDocTitle.Text;
documentBLL.DocRev = int.Parse(txtDocRev.Text);
if (documentBLL.Add())
{
MessageBox.Show("Add Success");
}
}


private void btnEdit_Click(object sender, EventArgs e)
{
DocumentBLL documentBLL = new DocumentBLL();
documentBLL.DocID = int.Parse(dataGridView1.SelectedRows[0].Cells["DocID"].Value.ToString());
documentBLL.DocTitle = txtDocTitle.Text;
documentBLL.DocRev = int.Parse(txtDocRev.Text);
if (documentBLL.Update())
{
MessageBox.Show("Update Success");
}
}


private void btnSelect_Click(object sender, EventArgs e)
{
DocumentBLL documentBLL = new DocumentBLL();
dataGridView1.DataSource = documentBLL.Select();
}

}

SajjadKhati
جمعه 07 بهمن 1401, 07:51 صبح
سلام
بله ، معماری ۳ لایه هست .
معماری لایه ای میگه فقط هر لایه ، میتونه از لایه ی بعدیش استفاده کنه . فرضا اگه یه کلاسی که خودتون در لایه ی دیتابیس ساختین ، نمیتونین از ۲ لایه ی قبل تر ، یعنی از لایه ی presentation ، بهش دسترسی داشته باشین . بلکه یا باید داده های پایه را از presentation براش از طریق لایه ی منطق تجاری ارسال یا دریافت کنید یا برای دریافت اون اطلاعات از لایه ی دیتابیس ، در لایه ی presentation ، یک کلاسی معادل اون کلاسی که درون لایه ی دیتابیس ایجاد کردید ، ایجاد کنید که وظیفه ی لایه ی منطق تجاری ، تبدیل اطلاعات این دو کلاس در این دو لایه برای ارسال و دریافت اطلاعات باشه .

البته این کدتون ، معماری ۳ لایه ی presentation - business logic - data access هست .
معماری ۳ لایه های دیگه ای مثل mvvm وجود داره که کار را سخت تر اما وابستگی به منطق تجاری را کمتر میکنن .

البته در کدتون اصول تزریق وابستگی و solid و اینها رعایت نشد که ربطی به معماری ۳ لایه ندارن .