Copyright © 2003-2009
By Suthep Sangvirotjanaphat
  Mobile: 089-967-2200, 081-915-7816
Phone: 0-2992-4877   Fax: 0-2992-4878
Fast Contact Us

GreatFriends.Biz Community

Custom Search
Copy เพื่ออ้างอิงถึงข้อความนี้:
 MESSAGE #102635 (อ่าน 6,060 ครั้ง)

Blog - tapeza555 : Dev All In One :)

Tags: Web, Crystal Report, OOAD/UML, Blog, Article

เกริ่นนำ

 

   รู้สึกช่วงนี้ห่างหายจากบอร์ด ไปนานยุ่งๆ เลยไม่ค่อยได้เข้า ไม่รู้มีใครพอจะจำได้ใหมเนี่ย *-*
พอดีรู้สึกอยากจะมี Blog ของตัวเองบ้าง แต่ไม่อยากใช้พวกที่มันมีอยู่แล้ว
อยากจะเขียนเองมากกว่า(ใช้ ASP.NET) แต่ก็ยังไม่ว่างซักที วันนี้เลยว่าไม่รอดีกว่า ขอใช้ GF
เป็นที่เขียนข้อมูลไปก่อน แล้วค่อยๆทำเว็บไปเรื่อยๆ :)
 
เนื้อหาใน Blog
 
    ก็คงหนีไม่พ้น ASP.NET ,OOP ,Crystal Report ,Tip/Trick และ ก็อะไรที่เกี่ยวกับ Web
 หรืออื่นๆที่อยากจะเขียน หรือถ้าผมเห็นว่าคำถาม หรือไหนน่าสนใจ ก็จะเอาใส่ไว้ในนี้ด้วย
 ผมรู้สึกว่า มีหลายๆๆคำถามใน GF มันซ้ำกัน ตอบซ้ำไปซ้ำมา เลยว่ากะรวมมันเอาไว้ที่นี่เลย :)
 
About Me
 
  ผมจบจาก KU KPS ( Comsci 2 )  ถ้าใครเรียนที่นั่น ก็แวะมาทักทายกันได้ครับ คิดถึง ม.จริงๆ :)
ผมรู้จัก GF ก็ 3 ปีกว่าพอๆกับที่จบ  คงเหมือนคนอื่นๆ มั้ง ที่ทำโปรเจ็กจบ เลยถึงหาข้อมูลถึงได้เจอ GF
ได้รู้จักพี่เพื่อนๆ เยอะเลย ตอนนี้ผมก็ทำ ASP.NET อยู่ครับ ..
 
ข้อตกลง
 
  พอดีผมอยากจะใช้แค่กระทู้เดียวเขียนถ้าเป็นไปได้  ถ้าบทความไหนชอบก็แค่
Vote +  ก็พอครับ อย่าไป Post เช่น ชอบมากๆๆ ,ดีมากๆๆ เพราะ เดี่ยวกระทู้มันจะยาวไป
แต่ถ้าหากบทความไหน คิดว่ามันไม่ถูกหรือ มีที่ดีกว่า อันนี้ก็ Post ไว้ได้เลยครับ ไม่ว่ากันครับ
 
ปล.
 
 - อย่าไปคาดหวังอะไรกับ Blog นี้มากอะครับ เอาขำๆนะ  แต่ก็จะพยายามมาอัพเรื่อยๆ *-*
 - ถ้าใครอยากจะ Add เอ็ม ผมได้ที่ tapeza555@windowslive.com บอกด้วยนะครับมาจาก GF
   แต่ปกติก็ออนไว้เฉยๆ ไม่ค่อยได้คุยอะ *-*
 


tapeza555 วันที่ส่ง: 18 มี.ค. 52 17:46 GMT+7
วันที่ปรับล่าสุด: 22 มิ.ย. 52 10:57 GMT+7
REPLY #1 (102636)
Tag : GF Trick
    วันนี้ยังไม่รู้เขียนอะไร เอาเป็นว่าเอาง่ายๆก่อนละกัน
 มีใครบ้างที่รู้ว่า GF มีวิธีการ Search ตามคนตอบ ได้ด้วย
เช่น ผมเคยเห็นพี่ jnithi  ตอบ เรื่อง response.redirect ก็พิมแบบนี้ครับ
 
by:jnithi  response.redirect
by:nano
by:surrealist
...
แจ๋วใหมครับ :)
 
- บางครั้งบอกว่าเคยเห็นกระทูนั้น กระทู้นี้แต่ Search หาไม่เจอ
ลอง ติ๊กถูกที่ Search more in... ดูสิครับ สำหรับ กระทู้ที่เก่าๆ มักจะอยู่ในนี้
 
 
ปล. ใครมีอะไรเพิ่มเติม ก็โพสต์ได้เลยครับ


tapeza555 วันที่ส่ง: 18 มี.ค. 52 18:12 GMT+7
วันที่ปรับล่าสุด: 18 มี.ค. 52 18:12 GMT+7
REPLY #2 (102637)

Tag : ASP.NET/Javascript

How To : Focus TextBox  หลังจาก Asp.net  มัน PostBack

 

 - พอดีผมแอบไปเห็นกระทู้นี้ครับ http://greatfriends.biz?102569
  พี่ banpote_tt ได้ตอบไว้มีรูป ทำให้เห็นภาพดีมากๆ เลยว่าขอเอา link
มาโพสต์ไว้ที่นี่ละกันครับ ..
 
ส่วนนี่ผมเลยลอง ทำอีกวิธีครับ ใช้ Javascript มาช่วยครับ
 แนวคิด
   - ของผมจะเอาค่าเก็บไว้ใน HiddenField ก่อนขณะที่ เรา Focus ที่ textbox
    พอมัน PostBack กลับมาก็ เอาค่าจาก HiddenField  กลับมา Set focus มัน
สังเกตุนะครับ ผมเอา Javascript ตอนที่ Set เอาไว้ด้านล่างสุด
มาลองดูกันครับ..
 

<asp:Content ID="Content1" ContentPlaceHolderID="cphMainContainer" Runat="Server">

<asp:TextBox ID="TextBox1" AutoPostBack="true" runat="server" onfocus="setCurrentFocusId(this.id);" ></asp:TextBox>

<asp:TextBox ID="TextBox2" AutoPostBack="true" runat="server" onfocus="setCurrentFocusId(this.id);" ></asp:TextBox>

<asp:TextBox ID="TextBox3" AutoPostBack="true" runat="server" onfocus="setCurrentFocusId(this.id);" ></asp:TextBox>

<br />

<asp:Button ID="Button1" runat="server" Text="Button" />

<asp:HiddenField ID="HiddenField1" runat="server" />

 

    <script type="text/javascript">

        function setCurrentFocusId( id ){

            document.getElementById('<%=HiddenField1.ClientID%>').value = id;

        }

                    

        var currentFocusId = document.getElementById('<%=HiddenField1.ClientID%>').value;

        if(currentFocusId != ""){

        var currentTextBox = document.getElementById( currentFocusId );

        //use for FF รู้สึกว่าแค่นี้ Firefox ก็ใช้ได้แล้ว

        currentTextBox.focus();

        //use for IE อันนี้สำหรับให้ IE ทำงาน

        if(currentTextBox.createTextRange) {

            var range = currentTextBox.createTextRange();

            range.move('character', currentTextBox.value.length);

            range.select();

       }

    }

    </script>

</asp:Content>

 
 
by tapeza555
ASP.NET & Software SipleList :)
 
ปล. อันนี้ต้องไม่อยู่ใน UpdatePanel นะครับ และ ที่มัน Focus มันจะไปที่หลังสุด ของ Text เสมอ T_T


tapeza555 วันที่ส่ง: 18 มี.ค. 52 18:46 GMT+7
วันที่ปรับล่าสุด: 18 มี.ค. 52 18:46 GMT+7
REPLY #3 (102671)

Tag:Error,.Net

Error In Action : Object reference not set to an instance of an object. ****

 
    วันนี้แอบแว่บมาโพสต์ง่ายๆ เร็วๆ ก่อนละกันครับ
ผมให้ชื่อว่า Error in Action โดยผมเลือก Error ที่มันฟ้องว่า 
Object reference not set to an instance of an object.
 
   Error ตัวนี้ ถ้าใครที่เพิ่งมาหัดเขียน Dotnet ใหม่ๆๆจะเจอ บ่อยมาก
และผมเห็นคนถามกันบ่อย แต่จริงๆ ต้อง บอกว่าเป็น Error ที่แก้ง่ายมาก
แค่รู้บรรทัดที่ Error เราก็รู้แล้วครับว่า มัน Eror จากตัวไหน
 
มาเข้าใจแนวคิดก่อน( Style ผมนะ ) Concept จำไว้แค่นี้พอครับ
 
****Error นี้มันเกิดจาก เอา object ที่มันเป็น null(C#) หรือ Nothing(VB.NET)
ไป จุด (.) ครับ******
 
ผมใช้เป็น DataTable ละกัน เพราะหลายคนต้องเคยใช้ จะได้รู้สึกคุ้นเคย ลองดูตัวอย่าง (C#) 
Ex1
DataTable dtEmp= null; 

DataRow dr = dtEmp .NewRow();  <--- มันจะ Error บรรทัดนี้ ( dtEmp มันเป็น null )

 
 วิธีแก้ ก็แค่ new object ให้มัน 
 DataTable dtEmp= new DataTable ();
 ...
 DataRow dr = dtEmp.NewRow();  <---เท่านี้ก็ไม่ Error แล้ว (ผมข้ามเรื่องของ การ Add Column ไปนะครับ**)
 
Ex2
 DataTable dtEmp= new DataTable (); 

int rowCount = dtEmp.Rows.Count;<-- ถ้ามัน Error บรรทัดนี้ ลองดูสิว่าน่าจะมาจากตัวไหน ???

****เอา Concept ที่ผมบอกมาใช้ครับ ***** ( Error เกิดจาก การเอา obj ที่มันเป็น null ไปจุด )
 
ลองดูว่าที่มัน จุด มีอยู่ 2 ที่ คือ   dtEmp.Rows กับ Rows.Count
- แต่ให้สังเกต นะครับ ว่า dtEmp มันได้ new เรียบร้อยแล้ว ( DataTable dtEmp = new DataTable (); )
ดังนั้น ตัวการที่ทำให้ Error ก็ต้องเป็น Rows.Count เพราะ Rows มันเป็น null แล้วไป จุด ครับ ฟันธง !!
 
แต่เดี๋ยวก่อนครับ
 *************
  อันนี้เป็นตัวอย่างนะครับ ว่าถ้ามัน Error Object reference not set to an instance of an object.
มันน่าจะเกิดจากตรงไหน แต่จริงๆแล้ว ที่ Rows.Count   ตรง Rows   มันไม่มีทางเป็น null หลอกครับ .Net มันจัดการ new
ให้เราอยู่แล้วครับ ดังนั้น หากเจอ ว่า dtEmp.Rows.Count มัน Error ก็ ฟันธง!! ไปเลยครับ ว่า dtEmp มันต้องเป็น null แน่ๆๆ
 
แต่ถ้าเป็น กรณี ที่เราสร้าง Class เอง เช่น
Employee emp = new Employee();
emp.Dept.DeptName = "IT";  <---- อันนี้ ฟันธง ได้เลยครับ ว่า Dept มัน เป็น null แน่ๆๆ
คราวนี้ เราก็ค่อยไปดูครับว่าทำไม Dept มันถึง null แล้วก็แก้ไปครับ :)
 
ขออีกสักตัวอย่างละกันครับ
Ex3
 DataTable dtEmp= new DataTable (); 
 dtEmp = DataBaseHelpers.GetEmployee( "Select * From Emp" ); ****
 int rowCount = dtEmp.Rows.Count; <---- ดัน Error ที่นี่ Error ได้ไง ก็ new  DataTable  แล้ว หนิ *-*
 
อันนี้ก็สังเกตุได้ไม่ยากครับ ถ้า Error บรรทัดนี้ แสดงว่า dtEmp มันเป็น null แน่ๆ
ให้มองย้อนกลับไป จะเห็นว่า dtEmp มัน รับ ค่ามาแบบนี้
 dtEmp = DataBaseHelpers.GetEmployee( "Select * From Emp" );
 
ฟันธง!! ไปเลยครับ ว่า ค่าที่ Return มาจาก DataBaseHelpers.GetEmployee("...");
มันต้องเป็น null แน่ๆๆ แม้ว่าเราจะ new obj ให้ dtEmp ไปแล้ว แต่ มันถูก เปลี่ยนค่าตรงบรรทัดนี้
dtEmp = DataBaseHelpers.GetEmployee( "Select * From Emp" );
 
นั่นคือ แค่นี้เราก็ค่อยไปดู หรือไปแก้ ที่ Class  DataBaseHelpers เอาครับ
คิดว่าคงพอเห็น ภาพ มากขึ้นนะครับ :)
 
วันนี้เอาแค่นี้ก่อนละกันครับ ขนาดง่ายๆๆ แค่นี้ยังเขียนซะเหนื่อยเลย
 
ปล.
 *** null ใน C# ( Nothing ของ VB ) กับ ค่า null (ของ DataBase ) มันคนละค่ากันนะครับ
 *** null (ของ DataBase ) มันคือ DBNull.Value ใน DotNet(C#,VB)
 ***  จำไว้แค่ว่า ถ้าเป็นค่า null (ของ DataBase ) เอามาจุดได้นะครับ ---> ได้จาก DataReader,DataTable คือ ดึงมาจาก DataBase
เช่น
string empName =dtEmp.Rows[0]["EmpName"] .ToString();
    -->dtEmp.Rows[0]["EmpName"] เป็นค่า null ใน DataBase( DBNull.Value ใน . Net ) *** อันนี้มัน เอามา จุดได้ครับ
 string name1 = null;
 string empName2 = name1.ToString(); <--- อันนี้ Error ครับแน่ๆครับ


tapeza555 วันที่ส่ง: 19 มี.ค. 52 11:14 GMT+7
วันที่ปรับล่าสุด: 19 มี.ค. 52 11:14 GMT+7
REPLY #4 (102701)

Tag: Javscript,ASP.Net

How To : Popup หน้า Window ใหม่และส่งค่ากลับ ทำยังไง ??? ( ภาค 1 )

 
   พอดี ผมเห็นกระทู้นี้ครับ http://greatfriends.biz?102661
ถามเกี่ยว กับเรื่อง การส่งค่ากลับจากหน้า popup ซึ่ง พี่ jnithi ได้ตอบเกี่ยวกับการใช้ JSON ได้ดีมากๆๆ ถ้าไง
ลองเข้าดูตาม Link นะครับ  ซึ่งผมมักจะเห็นคำถามใน GF เกี่ยวกับเรื่องนี้บ่อยมาก *-*
ก็เลยว่าเอามาเขียนเป็นบทความซะเลย เผื่อหลายๆๆท่านจะได้พอมองเห็นภาพมากขึ้น
 
   สำหรับบทความนี้คงพูดถึงวิธีการ เรียก และส่งค่า (ไม่ได้ใช้ AJAX นะครับ ใช้ Javascript ธรรมดา) ลองมาดูกัน
หากพูดถึงการ Popup  ผมแบ่งไว้ 2 ประมาณวิธีครับ คือ
  1. ใช้คำสั่ง window.open("");
  2. ใช้คำสั่ง window.showModalDialog(""); หรือ window.showModelessDialog("");
 
คำถามคือ แล้ว 2 อันนี้มัน มันต่างกันยังๆไง  ???
ตอบ :  
 - สำหรับ window.open มันเป็นการเปิดหน้า Popup ใหม่ (กรณี target = '_blank' ปกติป็น Default ให้อยู่แล้ว)
   ซึ่ง เรายังหน้าสามารถคลิ๊ก กลับมาทำงาน ที่หน้าหลัก(หน้าแม่)ได้  ไม่เกี่ยวข้องกัน
 
 - ส่วน window.showModalDialog อันนี้เป็น Dialog จริงๆ นั่นคือ หากเรายังไม่ปิด หน้า Dialog ก็จะไม่สามารถ
   ทำงานที่หน้าหลัก(หน้าแม่) ได้ ส่วน  window.showModelessDialog(""); คล้ายกัน แต่มีข้อต่างนิดหน่อย ลองไปทำดูครับ
 
สำหรับวิธีเรียกใช้งาน ผมว่าดูที่ google แล้วกันครับ นี่ผมเอา Link มาฝากเผื่อขี้เกียจหา
window.open
window.showModalDialog
 
ประเด็น คือ แล้วจะใช้อันไหนดี ลองมาดูข้อดี ข้อเสียกันครับ
 - window.open ค่อนข้างที่จะรองรับได้หลาย Browser ครับ(IE4+,Firefox1+,Opera9+)
 
 - window.showModalDialog  ใช้งานได้ดี เฉพาะ IE ส่วน Browser อื่นมักจะมีปัญหา ทำงานไม่ได้ *-* 
- และวิธีการ return ค่ากลับมายังหน้าแม่ ของแต่ละอันต่างกันครับ
 เดี๋ยวผมจะเขียนวิธีการทำไว้ข้างล่างครับทั้ง 2 วิธีครับ
 
ส่วนตัวผม ชอบ window.open ครับ :)
 
ASP.NET Control + JavaScript
  ก่อนที่จะไปถึงการเขียนวิธีการทำ ผมขอปูพื้น เรื่องกี่ยวกับ Control ของ ASP.NET
และการทำงานของ Javascript ซักนิดก่อนครับ (ได้พื้นฐาน จะได้ประยุกต์ได้)
ถ้าใครทราบแล้วก็ข้ามไปอ่าน ที่อื่นเลยครับ :)
 
  ปกติแล้วเวลาเขียน ASP.NET พอกดรันแล้ว มันก็จะได้ เป็น Html ครับ
สมมุติผมกดปุ่มตอนที่รันแล้ว มันจะทำงานที่ ฝั่ง Client ก่อน แล้วจึงไปทำงานที่ฝั่ง Server
 
หน้า *.aspx

<asp:Button ID="Button1" runat="server" Text="Button"

    OnClientClick="return window.confirm( 'Submit to server?' );" OnClick="Button1_Click" />

 
  หน้า *.aspx.cs

protected void Button1_Click( object sender, EventArgs e ) {

    //วิธีการ write script ให้กับหน้า web ของเรา  เดี๋ยวผมไว้ค่อยเขียนที่บทความอื่นละกันครับ

    //กรณีนี้ไม่ได้ใช้ AJAX นะครับ

    Page.ClientScript.RegisterStartupScript( Page.GetType(), "", "window.alert('Hello GF!!');", true );

}
 
ผลการรัน program
เวลามัน run มันจะมี Confirm มาถามว่า Submit to server?
- ถ้ากด yes มันก็จะเข้าไปทำ Code
  ทางฝั่ง server และก็จะ alert มาว่า Hello GF!!
- ถ้ากด no จะไม่ไปทำงานทางฝั่ง sever
 
*** สังเกตุตรง OnClientClick นะครับ ผมใส่ return ไว้
 
  OnClientClick="return window.confirm( 'Submit to server?' );"
 
  ถ้าเราไม่ใส่ return ไม่ว่าจะกด yes หรือ no มันก็จะทำงานที่
Code ฝั่ง server นั่นคือ จะ alert มาว่า Hello GF!! เพราะ Button ของ ASP.NET โดย default
มันจะ Submit เข้า server เสมอ
 
ลองมา View Source ตอน Run ดูครับ
<input type="submit" name="Button1" value="Button" onclick="window.confirm( 'Submit to server?' );" id="Button1" />
 
นั่นคือ มันแปลงจาก Button(ASP.NET) เป็น Input type="submit"
และตรง OnClientClick ก็จะกลายมาเป็น onclick ของ input ครับ
 
Tips/Trick
  ในเมื่อเรารู้แล้วว่ามันแปลงเป็น Input type="submit"  ก็แสดงว่ามันสามารถใช้
Event ต่างๆ ของ Input type="submit" ( Control อื่นก็ทำได้นะครับลองไปใช้ดู )
เช่น ผมใส่ไปตรงๆๆ เลยแบบนี้ ทั้งๆๆ ที่  Button  มันไม่มี Property/Event พวกนี้อยู่

<asp:Button ID="Button1" runat="server" Text="Button" style="background-color:Gray" onmouseover="window.alert(' Hello ');" />

 

เดี๋ยวมาต่อครับตอน 2 ครับ วันนี้เหนื่อยแล้ว T_T

ยังไม่ได้เข้าเรื่อง เลย  *-*



tapeza555 วันที่ส่ง: 19 มี.ค. 52 17:44 GMT+7
วันที่ปรับล่าสุด: 19 มี.ค. 52 17:44 GMT+7
REPLY #5 (102774)

How To : Popup หน้า Window ใหม่และส่งค่ากลับ ทำยังไง ??? ( ภาค 2 )

 
 หลังจากนอกเรื่องไปซะนาน กลับเข้ามาประเด็นการทำ Popup Dialog ดีกว่า
 
คำถาม 1 : วิธีการใช้ window.open ให้ popup แล้วส่งค่ากลับทำยังไง ???
 
**** ที่ผมจะทำต่อไป จะพยายามทำให้เห็นหลายๆๆ วิธี ในแต่ละสถานะการณ์  นะครับ เผื่อเลือกใช้เอา
 ถ้าชอบ วิธีไหนก็ทำไปวิธีเดียวเลย ไม่ต้อง ปนไป ปนมาเหมือนผม ครับ****
 
 
สถานะการณ์
   สมมุติผมมี หน้าแม่ ชื่อ Default.aspx แล้วต้องการให้ Popup หน้า PopupDialog.aspx แล้วเซตค่ากลับมายัง
TextBox ของหน้า Default.aspx   
 
วิธีการ
   จำไว้แค่นี้ครับ ใช้ 2 คำสั่งคู่กันเสมอ
    - window.open(ใช้ส่งไป)
    - window.opener (ใช้ส่งค่ากลับ ) ---> เป็นการเรียกใช้หน้าแม่ ที่ใช้คำสั่ง window.open
 
วิธีคิด
     ใช้หน้าแม่เรียกคำสั่ง window.open ในการเปิด Dialog แล้วให้หน้าลูก เรียกใช้คำสั่ง window.opener.UpdateData() 
 เพื่อเข้ามาใช้ function UpdateData ที่เราเขียนไว้ในหน้าแม่ สำหรับการ set ค่าให้ กับ Control ต่างๆๆในหน้าแม่
 
หน้าแม่ Default.aspx  (ใช้ window.open )

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

        <script type="text/javascript">                        

                // ผมสร้าง function UpdateData ในหน้าแม่ เพื่อเซตค่าให้กับ Control ในหน้านี้

                function UpdateData(retValue){

                        // คำสั่ง  '<%=TextBox1.ClientID%>' เป็นการเอาค่า ID ของ Server Control  หลังจาก Run แล้ว

                        // นื่องจากหาก Page นี้ ใช้ MasterPage ID มันจะไม่ใช่ TextBox1

                        // แต่คำสั่ง Javascript  document.getElementById ต้องใช้คู่กับ ID ที่มัน gen หลังจาก Run แล้ว         

                        document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue;

                }
                // ใช้เปิดหน้า Popup
                function popupDialog() {
                     //MyDialogName เป็นการตั้งชื่อให้กับ Popup window ของเรา ถ้ามันเปิดอยู่ แล้ว จะไม่เปิดใหม่ซ้ำอีก
                      var win1 = window.open( 'PopupDialog.aspx' ,'MyDialogName','width=600,height=500','_blank');   
                     //ปกติ เวลาเราเปิด popup ไปแล้ว  แค่พับหน้ามันลงไป ไม่ได้กดปิด
                     //แต่ถ้าเราไปกด ที่ปุ่มในหน้าแม่ใหม่ มันจะไม่ยอม focus ให้ เราก็ใช้ win1.focus(); แบบนี้           
                      win1.focus();
                      return false;
                }

        </script>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

//มันอยู่ที่ว่าเราต้องการทำอะไร

//สำหรับกรณีนี้ ผมบอก แค่ Popup หน้าใหม่ ไม่อยากให้หน้ามัน Refresh เลยสั่ง return false

<asp:Button ID="Button1" runat="server" OnClientClick="return popupDialog();" Text="Button" />

 

//ถ้าใช้ Html Control แบบนี้ หรือ Control ที่ไม่มีการ Post เข้า server ก็ไม่จำเป็นต้อง return false;

<input id="Button2" type="button" onclick="window.open( 'PopupDialog.aspx' );" value="button" />

</asp:Content>

 
หน้าลูก PopupDialog.aspx
<body>

      //   พอดี dotnet มันโวยวาย ตอนที่ผมเอา script ไปไว้ใน header

       // ผมไม่อยากไปทะเลาะกับมัน เลยขอย้าย script ลงมาที่ body ละกันครับ

      "The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)."

        <script type="text/javascript">

            function closeDialogOnClient(){

                var retValue = document.getElementById( '<%=txtReturnText.ClientID%>' ).value;

                window.opener.UpdateData( retValue );

                window.close();              

            }

            function closeDialogOnServer( retValue ){

                window.opener.UpdateData( retValue );

                window.close();

            }

        </script>

        <form id="form1" runat="server">

          <div>

             //กรณีที่ผมไม่ return จาก function ผมก็สามารถ มา return false นี่ได้ครับ

            <asp:Button ID="btnClientClose" runat="server" Text="ClientClose" OnClientClick="closeDialogOnClient(); return false;" />

            //อันนี้ให้มัน Post ไปยัง server แล้วเรียกใช้ script closeDialogOnServer

            <asp:Button ID="btnServerClose" runat="server" OnClick="btnServerClose_Click" Text="ServerClose" />

            //เอาความรู้ที่ผมเกริ่นใน REPLY #4 (102701) มาใช้

            <asp:Image ID="Image1" runat="server" ImageUrl="~/Resources/Images/choose.gif"

                style="cursor:pointer" onclick ="closeDialogOnClient()" />

            <asp:TextBox ID="txtReturnText" runat="server"></asp:TextBox>

          </div>

        </form>  

</body>

 

// หน้า CodeBehide PopupDialog.aspx.cs สำหรับกรณีที่ กดbtnServerClose

 protected void btnServerClose_Click( object sender, EventArgs e ) {

    //ส่งค่า จาก txtReturnText ไปให้ function closeDialogOnServer

    Page.ClientScript.RegisterStartupScript( Page.GetType(), "", "closeDialogOnServer( '" + txtReturnText.Text + "' );", true );

}
 
 
วันนี้พอแค่นี้ก่อนดีกว่า รู้สึกจะยาวแล้ว *-*
 
Tips/Trick
 
// เราสามารถ Add Attribute ให้กับ Control ของเราได้ ในหน้า CodeBehide
//เช่น
<asp:Button ID="btnClientClose" runat="server" Text="ClientClose" OnClientClick="closeDialogOnClient(); " />
//เปลี่ยนเป็น
<asp:Button ID="btnClientClose" runat="server" Text="ClientClose" />
แล้วไป add ในหน้า CodeBehide  แทนแบบนี้
protected void Page_Load( object sender, EventArgs e ) {

        if(!Page.IsPostBack) {

            btnClientClose.Attributes.Add( "onclick", "closeDialogOnClient();" );

        }

}

 
ปล.
   - สำหรับบทความพวกนี้ บางคนอาจจะบอกว่ามันง่ายไปหน่อย แต่ผมถ้าเป็นคนที่เขียนใหม่ๆก็ยังไม่ค่อยรู้
     และที่สำคัญ ไอพวกง่ายๆแบบนี้ มักจะไม่ค่อยมีใครเขียนกัน ผมเลยตัดสินใจเขียนให้เองครับ :)
 
   - บทความผมไม่ได้เน้นให้ ลอกนะครับ อยากให้ได้ Concept แล้วประยุกต์เป็น ของตัวเองมากกว่า
 
   -  สงสัยแค่การ Popup นี่ อย่างต่ำๆ คงมี อีก 6-7 ภาคแน่ๆ  เหนื่อยจริงๆ เขียนบทความ *-*
      ถ้า ชอบก็โหวดได้นะครับ จะได้รู้สึกมีกำลังใจเขียน กลัวเขียนแล้วไม่มีใครอ่าน จะเหนื่อย ฟรี T_T
 


tapeza555 วันที่ส่ง: 20 มี.ค. 52 15:27 GMT+7
วันที่ปรับล่าสุด: 20 มี.ค. 52 15:27 GMT+7
REPLY #6 (102779)

พอดีเห็น http://greatfriends.biz?102667 เกี่ยวกับ MVC อึมน่าสนใจดี

ก็ถ้ามีเวลา จะลองมาเขียน บ้าง คงไม่ได้เน้น Framework (เพราะไม่เคยใช้ :))
แต่คงเป็นการพูด คุยกันซะมากกว่า
- Archetecture ต่างๆ
- OOP Playground :)

- MVC คืออะไร (Style tapeza555 )

- MVC vs Layer
 
.. อะไรประมาณนี้
 
ถ้ามีคนสนใจอาจจะ Vote + ก็ได้ครับ จะได้หาข้อมูลมาคุยกัน
 
ปล. แต่ขอบอกไว้ก่อนครับ อย่าไปหวังอะไรกับ Blog นี้มากครับ :)
      จริงๆ ผมสะสม Resource ไว้เพียบเลยแต่ขุดมาเขียนไม่ไหว *-*


tapeza555 วันที่ส่ง: 20 มี.ค. 52 15:43 GMT+7
วันที่ปรับล่าสุด: 20 มี.ค. 52 15:43 GMT+7
REPLY #7 (102810)
แล้วผมมาแทรกกลางนี่ผิดมั้ยครับ


notarry วันที่ส่ง: 21 มี.ค. 52 00:43 GMT+7
วันที่ปรับล่าสุด: 21 มี.ค. 52 00:43 GMT+7
REPLY #8 (103728)
How To : Popup หน้า Window ใหม่และส่งค่ากลับ ทำยังไง ??? ( ภาค 3 )
GridView + การส่งค่ากลับหน้าแม่ (Parent Page)
 
       แฮ่ๆๆๆ หายไปนานเลยกระทู้ตกไปไหนไม่รู้ *-*  ขอกลับมาเขียนต่อละกัน (ก่อนจะหายไปอีกรอบ )

ขอตอบคุณ notarry ก่อนครับ ว่าแทรกได้เลยครับ จริงผมไม่ได้ ซีเรียสอะไรหรอกครับ

แต่ผมไม่ทราบว่าคุณ notarry มีคำถามอะไรใหม ถ้าผมช่วยตอบได้และมีเวลา ก็จะช่วยนะครับ
ไว้ผมจะลอง search  by: notarry   เผื่อมีคำถามไหนน่าสนใจ จะได้เอามาเขียนครับ แต่ขอติดไว้ก่อนนะครับ
 
       มาเข้าเรื่องครับ พอดีวันนี้ผมเห็นกระทู้นี้ http://greatfriends.biz?103478
แล้วมันตรงกับที่ผมได้เขียนไว้ ก็เลยขอยกตรงนี้มาเขียนก่อนละกันครับ อย่างที่บอกว่ามีคนถามเรื่องนี้กันมาก
เลยเขียนเป็น Article เผื่อใครจะได้เอาไปประยุกต์ใช้ครับ
 วันนี้ผมยังไม่ค่อยว่าง เลยคงไม่มีเวลาอธิบายให้ละเอียดนะครับ ไงก็เอาเป็น Concept ไว้ละกัน
 
ผมปรับ Code หน้าหลักจาก REPLY #5 (102774)  นะครับ
 
หน้าแม่ Default.aspx  (ใช้ window.open )

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

        <script type="text/javascript"> 

                function UpdateData(retValue){ 

                        document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue;

                } 
                function popupDialog() {
                      var win1 = window.open( 'PopupDialog.aspx' ,'MyDialogName','width=600,height=500','_blank');     
                      win1.focus();
                      return false;
                }

        </script>

       <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 

        <asp:Button ID="Button1" runat="server" OnClientClick="return popupDialog();" Text="OpenDialog" /> 

</asp:Content>

 

มาดูหน้าลูกกันบ้าง PopupDialog.aspx
 
ประเด็นของหน้านี้ คือ จะต้อง PostBack เพื่อส่งค่ากลับหรือป่าว ????
กรณีที่ 1  แค่ต้องการ Click ที่ปุ่ม เช่น Image แล้วให้มัน เอาค่า ID (สมมุติเป็น Column ที่ 1 ส่งค่ากลับไป)
ถ้าเป็นกรณีนี้ ก็ไม่จำเป็นต้อง PostBack ครับ
 

 
<body>

        <script type="text/javascript">

            function closeDialog( retValue ){

                    window.opener.UpdateData( retValue );

                    window.close();

            }

</script>

<form id="form1" runat="server">

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"

        onrowdatabound="GridView1_RowDataBound">

            <Columns>

                <asp:TemplateField>

                        <ItemTemplate>

                                <asp:Image ID="imgSelect" runat="server" />

                        </ItemTemplate>

                </asp:TemplateField>

                <asp:BoundField DataField ="ID" HeaderText="ID" />

                <asp:BoundField DataField ="Description" HeaderText="Description" />

            </Columns>

        </asp:GridView>

</form>

</body>

 

หน้า Code สังเกตุ ผมทำใน Row DataBound

protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e ) {

    if(e.Row.RowType == DataControlRowType.DataRow) {

        Image imgSelect = (Image)e.Row.FindControl( "imgSelect" );

        //อันนี้ผมใส่รูปมือให้มันตอนที่ Mouse มัน Over บน Image ใส่ใน code behide หรือจะไปใส่แบบเดิมที่หน้า Html ก็ได้นะครับ 

        imgSelect.Style.Add( HtmlTextWriterStyle.Cursor, "pointer" );

        // e.Row.Cells[1].Text  เนื่องจาก Column ของผมมันเป็น BoundField เลยเรียกใช้แบบนี้

        imgSelect.Attributes.Add( "onclick", "closeDialog('" + e.Row.Cells[1].Text + "');" );

    }

}

 
หรือผมบอกว่าไม่ต้องการ ใช้ Image แต่ต้องการ Click หรือ Double Click ที่ Row ไปเลย ก็ทำแบบนี้ครับ

protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e ) {

        if(e.Row.RowType == DataControlRowType.DataRow) {

            e.Row.Style.Add( HtmlTextWriterStyle.Cursor, "pointer" );

            e.Row.Attributes.Add( "ondblclick", "closeDialog('" + e.Row.Cells[ 1 ].Text + "');" ); 

        }

}
 
Tip/Tricks
ผมเสริมให้อีก 1 กรณี คือ ถ้าใน GridView มันไม่มี Column ID(ไม่ต้องการ Show ) แต่จริงๆผม Bind DataTable
ให้กับ GridView ซึ่งมันมี Column ID อยู่แล้ว ผมสามารถดึงเอามาใช้ โดยไม่ต้องไปซ่อนมันไว้ แบบนี้ครับ

protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e ) {

    if(e.Row.RowType == DataControlRowType.DataRow) {

        e.Row.Style.Add( HtmlTextWriterStyle.Cursor, "pointer" );

        string myId = DataBinder.Eval( e.Row.DataItem, "ID" ).ToString();

        e.Row.Attributes.Add( "ondblclick", "closeDialog('" + myId + "');" ); 

    }

}

 
กรณีที่ 2  คือ ต้องการ PostBack ก่อน แล้วค่อยปิด Dialog
 
อันนี้ใช้ SelectCommand ครับ

protected void GridView1_SelectedIndexChanging( object sender, GridViewSelectEventArgs e ) {

    string myId = GridView1.Rows[ e.NewSelectedIndex ].Cells[ 1 ].Text;

    Session[ "DoOnServer" ] = "อาจจะทำอะไรสักอย่าง แล้ว เก็บใส่ Session เพื่อใช้ต่อ";

    Page.ClientScript.RegisterStartupScript( Page.GetType(), "", "closeDialog('" + myId + "');", true );

}
 
มาดูแบบใช้ ImageButton ในการเลือกดูบ้าง...

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >

        <Columns>

            <asp:TemplateField>

                <ItemTemplate>

                    <asp:ImageButton ID="imbSelect" runat="server" onclick="imbSelect_Click" />

               </ItemTemplate>

            </asp:TemplateField>

            <asp:BoundField DataField ="ID" HeaderText="ID" />

            <asp:BoundField DataField ="Description" HeaderText="Description" />

        </Columns>

</asp:GridView>

 

protected void imbSelect_Click( object sender, ImageClickEventArgs e ) {

    //แปลงกับมาเป็น ImageButton

    ImageButton imbSelect = (ImageButton)sender;

    //ใช้ NamingContainer เพื่อเอา Row นั้นมาใช้ อยากใช้ Colunms อะไรหรือ อยาก Find Control อะไรก็สบายแล้วครับ

    GridViewRow gvr = (GridViewRow)imbSelect.NamingContainer;

    Page.ClientScript.RegisterStartupScript( Page.GetType(), "", "closeDialog('" + gvr.Cells[1].Text + "');", true );

}

 
เป็นไงครับ วันนี้พอจะได้ Idia ไปประยุกต์ใช้ เพิ่มใหมครับ
สำหรับ MSN ตอนนี้ผมยุ่งๆๆ เลยไม่ค่อยได้คุยนะครับ
ถ้าใครทักเข้ามา แล้วผมไม่ได้ตอบก็ต้อง ขอโทษจริงๆ
 
 
ปล... อยากให้สังเกตุ วิธีที่ผมใช้นิดนึง  ในหน้าแม่ ( Parent ) กับหน้าลูก (Popup )
 
 ผมจะสร้าง UpdateData ไว้ในหน้าแม่ประมาณนี้ (อันนี้ผมส่งค่ากลับมาในลักษณะ ของ Array )
 function UpdateData(retValue){ 

         document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue[0];

         document.getElementById( '<%=TextBox2.ClientID%>' ).value = retValue[1];

 }
 
  และในหน้าลูก ผมจะเรียกโดยใช้ window.opener แบบนี้
 function closeDialog(){

       var myArray = new Array();

        myArray [0] = "ID001";

        myArray [1] = "Name"; 

        window.opener.UpdateData( retValue );

        window.close();              

   }

    คือ ผมจะส่งค่าข้าม Page มากกว่า ที่จะส่ง Id ข้ามมายังหน้า Dialog  
เช่น ผมจะไม่ได้ส่งค่า Id ของ Control มายังหน้า Dialog แล้วเซตค่าแบบนี้
 window.opener.document.getElementById( "TextBox1" ).value = '123';
เพราะหน้า Dialog จะได้ไม่ต้องรู้ว่าหน้าแม่  มันมี ID อะไร (ช่วยในการ Reuse หน้า Dialog ได้ครับ
ให้หน้าแม่ที่เรียก เป็นคนจัดการว่าจะเซต ค่าให้กับ Control ตัวไหนเองจะดีกว่า )
 
หน้า Default1.aspx
 function UpdateData(retValue){ 

         document.getElementById( '<%=TextBox1.ClientID%>' ).value = retValue[0];

         document.getElementById( '<%=TextBox2.ClientID%>' ).value = retValue[1];

 }
หน้า Default2.aspx
 function UpdateData(retValue){ 

         document.getElementById( '<%=txtCustomerName.ClientID%>' ).value = retValue[1];

 }
 
- อยากให้เขียนเรื่องอะไรก็ลองโหวดมาได้ครับ ถ้าผมพอมีความรู้ และมีเวลา ก็จะมานำเสนอะครับ
  อ่อ ถ้ามีวิธี ดีๆๆ กว่า Post เข้ามาได้เลยนะครับ มาแบ่งปันกันครับ
วันนี้ผมอู้งานมาเยอะแล้ว พอแค่นี้ละกัน


tapeza555 วันที่ส่ง: 8 เม.ย. 52 10:58 GMT+7
วันที่ปรับล่าสุด: 8 เม.ย. 52 10:58 GMT+7
REPLY #9 (103760)
เยี่อมครับผมคงได้ใช้ประโยชบ้าง


Ixus วันที่ส่ง: 8 เม.ย. 52 19:15 GMT+7
วันที่ปรับล่าสุด: 8 เม.ย. 52 19:15 GMT+7
REPLY #10 (103816)
ผมจบ KU 64 ครับ รบกวนขอความรู้ และความช่วยเหลือในโอกาสต่อไปด้วยนะครับ


caesar วันที่ส่ง: 9 เม.ย. 52 16:29 GMT+7
วันที่ปรับล่าสุด: 9 เม.ย. 52 16:29 GMT+7
REPLY #11 (103845)
ถ้าคุณเทปมาตอบให้ผมสงสัยผมจะได้ใจถามวันละหลายคำถามจนเบื่อแน่ๆครับ ถามได้ตั้งแต่พื้นยันไร้สาระเลยครับ หุ หุ หุ


notarry วันที่ส่ง: 9 เม.ย. 52 23:24 GMT+7
วันที่ปรับล่าสุด: 9 เม.ย. 52 23:24 GMT+7
REPLY #12 (104377)

How To : ทำไม Session Timeout ไวจัง 

Tag : ASP.NET
 
  ช่วงนี้ยุ่งจริง ไม่ค่อยได้เข้ามา GF  และยังไม่มีเวลาได้เขียนต่อ แต่พอดีไปเจอคำถาม เกี่ยวกับปัญหา
ว่า Session Timeout ตอนที่ Delete folder  ผมเห็นว่าน่าสนใจดี เลยเอามา Post ไว้ดีกว่าครับ
และไม่ต้องมานั่งเสียเวลาเขียนเอง
 
Bleak :
    ปัญหานี้คือ เมื่อคุณ delete หรือ rename folder จะทำให้เกิดการ restart ของ Application ครับ
ซึ่งมันก็ทำให้ Session State ที่เก็บแบบ InProc จะหายไปด้วย
คุณไม่สามารถหลีกเลี่ยงการ restart application ได้ หากจะลบหรือเปลี่ยนชื่อ folder
แต่สามารถจะเก็บ Session ไว้ได้ โดยเปลี่ยนโหมดเป็น StateServer หรือ SQLServer
 
ใน ASP.NET 2.0 ได้เพิ่มสิ่งที่เรียกว่า File Change Notifications (FCN) เข้ามาครับ
ซึ่งไม่มีใน ASP.NET 1.0 และ 1.1 และเจ้า FCN นี่เองครับคือสาเหตุให้ต้อง restart application

วิธีแก้ก็อย่างที่ผมได้แนะนำไปครับ แต่ก็มีวิธีอื่นๆอีก เท่าที่รู้ดังนี้ครับ

1. เขียน code ปิดการทำงานของ FCN ในส่วนที่ monitor directory ของ root application
แต่ควรให้ monitor เฉพาะ folder ที่จำเป็น เช่น Bin, App_Code, App_Themes
เพื่อที่จะยังสามารถ update DLL หรือไฟล์อื่นที่ต้องการ แบบอัตโนมัติได้ต่อไป
วิธีนี้ค่อนข้างยาก ถึงแม้ code นิดเดียว แต่ต้องอาศัยความเข้าใจค่อนข้างมาก

2. วิธี Directory Junction โดยใช้ tool ตัวหนึ่งชื่อ linkd.exe (เป็น tool หนึ่งใน Windows Server 2003 Resource Kit Tools
ทำการเชื่อมโยง sub-directory ใน WebApplication ไปที่ Directory ที่เรากำหนดได้ (คล้ายๆ virtual directory)
เราก็จัดการ link มันไปที่ folder นอก WebApplication
เมื่อเกิดการลบ folder ขึ้น FCN จะไม่รับรู้เพราะว่าอยู่ภายนอก
วิธีนี้ง่ายกว่าวิธีแรก แต่ก็อาจใช้ไม่ได้กับทุกกรณี เช่น ถ้าเราต้องการแสดงไฟล์แบบ Tree Explorer
อาจจะเขียน code ยากขึ้นมาก เพราะต้องหา path แท้จริงกันให้วุ่นวาย
 
How to resolve ?
 
natthavat28 :
    มันมีตัวที่ชื่อ Directory Monitoring คอยจับ Directory ผมอยู่ ทุกครั้งที่มีการ Rename / Delete
มันจะทำให้ App ผม Restart และ Session Lost ในที่สุด ตามที่ผมบอกไว้ Rep ก่อนหน้านี้
วิธีแก้แบบ Keyboard ทุบดินเลยครับ ปิดมันซะ
และนี่ Code ครับ ผมเอาไปยัดใส่ Global Event Application Start ซะเลย
 
System.Reflection.PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);

object o = p.GetValue(null, null);

System.Reflection.FieldInfo f = o.GetType().GetField("_dirMonSubdirs", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.IgnoreCase);

object monitor = f.GetValue(o);

System.Reflection.MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); m.Invoke(monitor, new object[] { });

 
All Credit For : คุณ natthavat28 , Bleak แห่ง narisa :)
 
ปล.
- พอดีผมยังไม่ได้ทดลอง Code ครับ ใครเอาไปใช้ ก็ มาบอกกันด้วยละกัน
- สำหรับ บทความ Popup Dialog ยังไม่หมดนะครับ เดี๋ยวไว้จะมาเขียนต่อ (ขอพักสักนิด ^^)
- ท่านถ้ามีคำแนะนำ หรือ บทความดีๆๆ Post ได้นะครับ หรือ มีคำถามอะไร
  ลองมาคุยกันครับ แลกเปลี่ยนกันครับ
 
ขอครับปรับกติกาใหม่ :) 
   เอาเป็นว่าใครอยาก Post อะไรก็ Post ได้เลยเต็มที่ครับ  พอดีรู้สึกว่าผมจะไม่ค่อยมีเวลามาอัพ
เผื่อท่านใด อยากแบ่งปัน ก็ช่วยๆๆ กันครับ
 
บทความหน้า เปลี่ยนแนวมาคุย เรื่อง Software Architecture กันบ้างดีกว่า
- Design Pattern
- MVC Pattern
- OOP
- Layer vs Tire
 
 
 


tapeza555 วันที่ส่ง: 21 เม.ย. 52 15:52 GMT+7
วันที่ปรับล่าสุด: 21 เม.ย. 52 15:52 GMT+7
REPLY #13 (104394)
ตอนแรกก็งงๆว่า Software Architecture คืออะไร พอบอกว่าเป็น Design เลยพอเข้าใจและ หุ หุ หุ แล้วจะรอติดตามผลงานนะครับ ว่าแต่คุณเทปไม่มี blog เหรอครับ


notarry วันที่ส่ง: 21 เม.ย. 52 19:06 GMT+7
วันที่ปรับล่าสุด: 21 เม.ย. 52 19:06 GMT+7
REPLY #14 (104482)

คือ จริงๆๆ ตั้งใจจะทำเองไม่อยาก ใช้ของฟรี แต่ยังไม่มีเวลาทำครับ

เลยมาโพสต์ไว้ที่ GF ดีกว่า ส่วนเรื่องการ Design นี่ก็มันดีครับ ไว้เด๋วมาคุยกัน
ตอนนี้ตัวเป็นเกลียวครับ


tapeza555 วันที่ส่ง: 22 เม.ย. 52 18:38 GMT+7
วันที่ปรับล่าสุด: 22 เม.ย. 52 18:38 GMT+7
REPLY #15 (106286)

Software Architecture =>OOP  + Design Pattern + Layer + Tier   มั่วนิ่ม ภาคที่ 1

 
      หายหน้า หายตาไปนานเลย กลับมาขอมาเขียนต่อและ  แต่พอจะเขียนไม่รู้จะเริ่มยังไงดี
เพราะ Architecture  นี่ก็มีหลายๆๆเรื่อง รวมๆ กันอยู่แถม  ตัวเองก็ไม่ได้เก่งอะไรเลย เขียนเอามัน  
ผิดยังไง ก็ค่อยมาแก้กันไป อย่าไปคิดมากนะครับ 
 
ทำไมต้องรู้ด้วย ไม่รู้แล้วเขียนโปรแกรมไม่ได้หรอ ?
 
-    จริงๆ ไม่ต้องรู้ก็เขียนได้ครับ แต่พอดีผมชอบเรื่องพวกนี้ก็เลยลองศึกษาดู  เคยสงสัย
  ใหมครับ OOP เรียนมาแล้ว สรุปแล้วเอามาใช้ยังไง   เอามาใช้ตอนไหน ?
 
-    ตอนนนี้เราใช้ VB ,C# โห OOP 100% อึม... นั่นมันภาษาครับ ไม่ใช่ Code ที่เราเขียน
  แต่จริงๆๆ ถ้าถามผมตอนนี้เลยนะ  ผมเองก็ไม่ได้เขียน อะไรที่มันเรียก OOP หรอก ครับ (ซะงั้น 555+)
  แต่มาคุยสนุกๆ GF แลกเปลี่ยนความคิดเห็นกันอยู่แล้ว
 
- ประเด็นที่เค้า แบ่งเป็น Layer ,Tire ก็เพื่อ  ง่ายต่อการแก้ไขโปรแกรมทีหลัง ,การเพิ่มเติมภายหลัง
 ,Reuse ,Security  และอะไรไม่รู้อีกมากมาย....
 
แต่ไม่ว่าจะยังไง มันก็คือ การเริ่มจากเมื่อก่อน ทำแบบนั้น แบบนี้ แล้ว เจอปัญหานั้น ปัญหานี้
Guru ทั้งหลายก็เลยหาวิธี แก้จนมีให้เห็นเยอะแยะไปหมดนั่นเอง
 
นี่เป็น Article ของพี่มี่ครับ เป็นการอธิบายคำศัพท์เกี่ยวกับ
สถาปัตยกรรม Loosely coupled ( แบบรวบรับ ) ดูได้ที่นี่ครับ
 
เขียนมาตั้งนานผมยังไม่ได้เข้าเรื่องเลย เพราะ ไม่รู้จะพูดถึง OOP หรือ Layer ดีหว่า (>_<)
เอาเป็นว่า ขอ Layer/Tier ก่อนละกันครับ
 
สงสัยวันนี้พอแค่นี้ ก่อนละกัน
 
 


tapeza555 วันที่ส่ง: 14 พ.ค. 52 19:12 GMT+7
วันที่ปรับล่าสุด: 14 พ.ค. 52 19:12 GMT+7
REPLY #16 (106293)
จริงๆ เขียนตอบไปเรื่องหนึ่ง แต่เอาไว้ก่อนดีกว่า คงได้คุยกัน อิอิ
OOP ก่อนดีครับคุณ Tapezaa ผมว่าพื้นฐานดี แบบนี้เรียกว่า Lobby รึเปล่านี่

ตอนนี้ผมกำลังศึกษาพวก Hibernate กับ Entity Framework
ซื้อหนังสือ Hibernate  in Action มา เปิดๆ ดูตัวอย่างหนึ่ง รู้สึกว่าน่าสนใจ
เห็นคุณ tapeza มี topic ของ OOP อยู่ เลยคิดว่าน่าจะหยิบมาคุยกันดู (ขอแทรกเรื่อง Layer ก่อน ไม่โกรธกันนะครับ -*-" )

ตัวอย่างที่จะยกมาถามไม่ได้มาจากในหนังสือนะครับ แต่รายละเอียดคล้ายๆ กัน
โจทย์ประมาณนี้ บ.แห่งหนึ่ง เปิดบริการรับจองโรงแรม จองรถรับส่ง จองทริปท่องเที่ยว จองตั๋วเครื่องบิน
จะเห็นว่าเรื่องจองเหมือนกัน แต่รายละเอียดไม่เหมือนกันแล้ว พอทำเป็น Domain ออกมาได้ Object ประมาณนี้

Class Reservation
    - ReservationNo
    - ReservationDate
    - Customer

Class HotelReservation : Reservation
    - RoomNo
    - RoomType
    - CheckInDate
    - CheckOutDate
 
Class CarReservation : Reservation
    - CarLicense
    - CarType
    - FromDate
    - ToDate
    - Destination

สมมติมีแค่นี้ มี Domain ประมาณนี้ แล้วเราจะออกแบบฐานข้อมูลยังไงดีครับ ???
ปล. ขอโทษนะครับ หากเป็นการเสียมารยาทจู่ๆ มาขัด Blog คนอื่น แต่ผมคิดว่าบางทีเรามายกตัวอย่างมาแลกเปลี่ยน น่าจะทำให้เห็นอะไรมากขึ้น
ไม่ได้มีเจตนาอื่นนะครับ


Sand King วันที่ส่ง: 14 พ.ค. 52 21:52 GMT+7
วันที่ปรับล่าสุด: 14 พ.ค. 52 21:52 GMT+7
REPLY #17 (106297)
ถ้าเป็นผมก็ออกแบบให้จอง 3 แบบเลย ส่วนไหนเหมือนก็ยุบรวมกัน จะว่าไปออกแบบตาม class ก็น่าจะใช้ได้ไม่ใช่เหรอครับ


notarry วันที่ส่ง: 14 พ.ค. 52 23:31 GMT+7
วันที่ปรับล่าสุด: 14 พ.ค. 52 23:31 GMT+7
REPLY #18 (106305)
  แจมได้เลยครับทุกท่าน วันนี้มาคุยเล่นๆ สนุกไปเลย   ก่อนอื่นผมต้องขอ อธิบายเรื่อง Layer สำหรับท่านอื่นๆ
ก่อนคร่าวๆ นิดนึง ^^ ครับ แล้วจะกลับมา Focus ที่ OOP
จากที่คุณ Sand King ได้ให้โจทย์มา
 
" ตัวอย่างที่จะยกมาถามไม่ได้มาจากในหนังสือนะครับ แต่รายละเอียดคล้ายๆ กัน
โจทย์ประมาณนี้ บ.แห่งหนึ่ง เปิดบริการรับจองโรงแรม จองรถรับส่ง จองทริปท่องเที่ยว จองตั๋วเครื่องบิน
จะเห็นว่าเรื่องจองเหมือนกัน แต่รายละเอียดไม่เหมือนกันแล้ว "
 
สิ่งที่เราสนใจ จากตัวอย่างก็คือ
# 1. น่าจะทำเป็นเว็บ (ASP.NET ก็เราใช้ MS อะนะ
# 2. มันต้องต่อกับ DataBase เอาอะไรดี Oracle,SQLServer,MySql  มั่วไป
# 3. แล้วระบบมันจองยังไง เออ มีข้อกำหนดอะไรบ้าง???
 
ลองมานั่งคิดดูว่าเราจะเขียนโปรแกรมยังไงกันดี
  - บางคนชอบ ออกแบบ DataBase เลย คิดก่อนว่ามี Table อะไรบ้าง แล้วก็เขียนโปรแกรม?
  - บางคนชอบ ออกแบบหน้าจอก่อนดีกว่า มี กี่หน้า แบบนี้ต้องมีหน้า Login หน้าจอง
  - แล้วมี วิธีอื่นหละ ????? ออกแบบ Class ก่อน  อึม มันเป็นไง ???
 
Layering Architecture
 1. Single Layer (มันเรียกแบบนี้ใหมหว่า)  รวมทุกอย่างไว้ที่เดียวเลย
      ไม่มีไรมาก ออกแบบหน้าจอ ,ออกแบบ Table แล้วก็เขียนไปเลย
 
Reservation.aspx

    protected void btnSaveReservation _Click( object sender, EventArgs e ) {

        using(SqlConnection conn = new SqlConnection("Connection string")){

            conn.Open();

            SqlCommand cmd = new SqlCommand( @"Insert Into Reservation

                    (ReservationNo,ReservationDate)Values(@ReservationNo,@ReservationDate)", conn );

                cmd.Parameters.AddWithValue( "@ReservationNo", this.getReservationNo() );

                cmd.Parameters.AddWithValue( ",@ReservationDate", Convert.ToDateTime(txtReservationDate.Text));

                cmd.ExecuteNonQuery();

        }

}

ทำเสร็จไวครับ สบายๆ  ..เออ...ลูกค้าบอกว่าอยากใช้ DBMS เป็น Oracle ครับ
หุหุ โชคดีนะเนี่ย Project มีแค่ 20 หน้า ไล่แก้ Code สบาย แล้วถ้ามีสัก 100 หน้า ??? ก็ยังสบายมั้ง 
 
ไม่ไหว แยก SQL ออกไปอีกที่ดีกว่าแยกเป็น Class
 
2.  2-Layer
    Presentation Layer(PL : ASP.NET ) --> Data Access Layer ( DAL )
 

Presentation Layer : ส่วนที่ติดต่อกับผู้ใช้ User Interface ( Window App , ASP.NET )

Data Access Layer : Class พวก Dao สำหรับที่ใช้ต่อ DataSource ( XML,Oracle ,SQL Server )
//Dao ย่อ มาจาก Data Acess Object มันเป็นชื่อ pattern ครับ 
//ทำให้หน้า Presentation Layer ไม่ต้องรู้ว่ามันติดต่อกับ DataBase อะไร
 แค่รู้ว่าเรียกยังไงก็พอ ( Encapsulation หุหุ เริ่มใช้ความรู้ OO บ้างแล้ว)
 
Reservation.aspx
 // Presentation Layer

   protected void btnSaveReservation _Click( object sender, EventArgs e ) {

        ReservationDao dao = new ReservationDao();

        dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );

   }
 
  //  Data Access Layer --- > อาจเป็น Class ที่อยู่ใน App_Code  หรือไปสร้าง project ใหม่เลย
  public class  ReservationDao  {
      protected void  Save( DateTime reservationDate) {

            using(SqlConnection conn = new SqlConnection("Connection string")){

                conn.Open();

                  SqlCommand cmd = new SqlCommand( @"Insert Into Reservation

                    (ReservationNo,ReservationDate)Values(@ReservationNo,@ReservationDate)", conn );

                cmd.Parameters.AddWithValue( "@ReservationNo", this.getReservationNo() );

                cmd.Parameters.AddWithValue( ",@ReservationDate", reservationDate );

                cmd.ExecuteNonQuery();

           }

       }       

  }
 
อื่ม เริ่มดูดี ถ้าเกิดมี 10 ปุ่ม  แล้วต้องแก้ ก็แก้ที่เดียว ที่ class ReservationDao  
อันนี้ของ MS ก็ได้ ทำ  DataSet ,TableAdaper มาช่วย
 
ว่าจะเขียนต่อ แต่ง่วงแล้ว ไว้ก่อนละกันครับ จริงๆที่พูด ว่าทั้งหมดนี่
จะอธิบาย คำว่า Domain ของคุณ Sand King เท่านั้นเอง
 


tapeza555 วันที่ส่ง: 15 พ.ค. 52 01:24 GMT+7
วันที่ปรับล่าสุด: 15 พ.ค. 52 01:24 GMT+7
REPLY #19 (106313)

คุณ Tape ครับ

แบบ   2-Layer นะ
 
เวลาเราเขียน Method Save เราเขียนใน Class ReservationDao  
เลยใช้ไหมครับ  ถ้าเราเขียนแบบให้มี Transaction ด้วยก็เขียนรวมกัน
ในคลาสนี้เลยใช่ไหม แล้วถ้าเราใช้ Method Save ในโปรแกรม
หลายครั้งนี่ จะเขียน Transaction ครอบยังไงครับ ผมสงสัยนะ
 
 
 
แล้วแบบ 3-Layer นี่เป็นยังไงครับ ใช้ Entity Framework หรือเปล่า
รออ่านอยู่นะครับ ขอบคุณครับ


tor วันที่ส่ง: 15 พ.ค. 52 09:45 GMT+7
วันที่ปรับล่าสุด: 15 พ.ค. 52 09:45 GMT+7
REPLY #20 (106519)

    ขอบคุณ คุณ tor มากๆๆครับที่สนใจอ่านบทความ..

เป็นคำถามที่ดีมากๆ ซึ่งผมก็ขอยอมรับอย่างไม่อายเลยว่า
ผมไม่ค่อยเก่งเรื่องของการออกแบบ  Transaction ,Security (จริงๆ ก็ไม่เก่งเลยซักอย่าง *-*)
 
ประเด็น ที่ถามคือ จะวาง Transaction ไว้ตรงไหนดี ระหว่าง PL หรือ DAL
  Presentation Layer(PL : ASP.NET ) -เรียกใช้-> Data Access Layer ( DAL )
 
    สำหรับผม ผมมองว่า DAL น่าจะเป็นส่วนของ CRUD (Create ,Retrieve ,Update ,Delete )
เท่านั้นก็พอแล้ว ส่วนการคุม Transaction ก็น่าจะโยนให้ Layer ที่อยู่เหนือกว่า เป็นคนจัดการไปครับ
นั่นก็คือ  Presentation Layer อะ
 
----------------------
Presentation Layer
----------------------
Data Access Layer
---------------------
 
//Presentation Layer
 protected void btnSaveReservation _Click( object sender, EventArgs e ) {
        using(TranscationScope ts = new TranscationScope()){

              ReservationDao dao = new ReservationDao();

              dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );

              //ทำอะไรอย่างอื่น
              XXXDao xDao = new XXXDao();
              xDao.Save( x );

         }           

 }
 
แต่ถ้าถามว่าเอาไว้ที DAL ได้ใหม ผมก็ว่าได้นะครับ ..
ไม่รู้ท่านอื่นมีความเห็นเกี่ยวกับเรื่องนี้ดี มาช่วยตอบหน่อยครับ :)
ผมก็อยากได้ Solution ที่ดีที่สุดครับ ดี กับดีกว่า เราก็เลือกดีกว่า อยู่แล้วครับ
ลองมา แชร์ กันครับ
 
 


tapeza555 วันที่ส่ง: 19 พ.ค. 52 09:57 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 09:57 GMT+7
REPLY #21 (106521)

อึมม คำถามต่อมาคือ  แบบ 3-Layer นี่เป็นยังไงครับ ใช้ Entity Framework หรือเปล่า ??

3.  3-Layer
 
 Presentation Layer (PL)---> Business Logic Layer (BLL) --> Data Access Layer (DAL )
 
----------------------
Presentation Layer
----------------------
Business Logic Layer
----------------------
Data Access Layer
---------------------
 
ผมมองแยกกันแบบนี้ครับ Layer เป็นการแยก Code ที่ทำงานเหมือนกันไว้ด้วยกัน
เช่น Code ที่ใช้ติดต่อ DataBase (ก็แยกไว้ที่ DAL) , Code แสดงผลหน้าจอ ก็อยู่ที่ PL
อะไรประมาณนี้
 
ส่วน Entity Framework ผมมองว่ามันก็คือ   Framework ที่ใช้ Support กับกับ Layer หนึ่งๆ
ซึ่งก็คือ Data Access Layer ครับ
 
 Presentation Layer (PL)---> Business Logic Layer (BLL) --> Data Access Layer (DAL )
[ jQuery(js Framework) ,AJAX ]---->[ BLL  คิดไม่ออก ]-------->[ DataTable ,DataSet ,NHibernate, LINQ to SQL,Entity Framework]
 
ดังนั้นถึงไม่ใช้  Entity Framework ก็เป็น 3-Layer ได้ครับ...


tapeza555 วันที่ส่ง: 19 พ.ค. 52 10:11 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 10:11 GMT+7
REPLY #22 (106524)
น้อง เทป ติดต่อ คุณมี่ ด้วย
งานเข้านะน้อง ด่วนเลย


Nine (นาย) วันที่ส่ง: 19 พ.ค. 52 10:14 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 10:14 GMT+7
REPLY #23 (106528)

ก่อนที่จะไปไกลกว่านี้ ผมขอกลับมาที่คำว่า Layer ก่อนครับ ผมยังไม่ได้อธิบายไว้ใน

ตอกแรกเลย
 
Layer : มันเป็นเหมือน การแยกส่วนของโปรแกรมให้เป็นอิสระต่อกันมากขึ้น
ทำให้เวลาแก้ก็แก้ง่ายขึ้น หรืออาจเอามา Reuse ใหม่ได้
ขอย้อนกลับไปตรงที่ผมบอก REPLY #18 (106305)
 
# 1. น่าจะทำเป็นเว็บ ( ASP.NET ก็เราใช้ MS อะนะ )  ---> Presentation Layer
# 2. มันต้องต่อกับ DataBase เอาอะไรดี Oracle,SQLServer,MySql   มั่วไป ---> Data Access Layer
# 3. แล้วระบบมันจองยังไง เออ มีข้อกำหนดอะไรบ้าง???---> Business Logic Layer
 
Presentation Layer  ---> เป็นส่วนของการแสดงผล เช่น ASP.NET ,Window App, Console App ...
Business Logic Layer ---> เป็นส่วนของการคำนวณ เงื่อนไขต่างๆ หรือ ของระบบที่เราเขียน เช่น Ecommerce ก็จะมีเรื่อง
                                     ที่ระบบนั้นๆ ต้อง Check   เช่น การให้ Promotion กับสมาชิก , การคำนวณส่วนลด
                                     อะไรประมณนี้ มันไม่เกี่ยวกับว่า  จะใช้ Data Base อะไร
                                    หรือ จะเขียน Win App , ASP.NET พอมองออกนะครับ
 
Data Access Layer ---> การติดต่อ Data Base ,Data Source ต่างๆ
 
แล้วทำไมต้องแยก
  PL -->BLL-->DAL
 
นั่นคือ หากเรา เปลี่ยน PL  เราก็ยังคงใช้ Code BLL กับ DAL (reuse ) ได้
หรือ ถ้าเกิดเปลี่ยน DataBase หรือ Data Source ก็ยังคงไม่กระทบกับ ส่วนอื่นมากนัก
 
และถ้าแยก Code ออกมา มันจะทำให้ Code บางส่วนเขียนไว้แค่ที่เดียว แล้วถูกเรียกใช้
จากหลายๆๆ ที่ ถ้าเกิดจำเป็นต้องแก้ไข ก็จะได้แก้ที่เดียว แก้ง่ายขึ้นครับ
 
*.aspx.cs-----------v
*.aspx.cs--------> BLL
*.aspx.cs-----------^
 
 
  ถ้าผมอธิบายตรงไหนผิด ก็แย้งกันได้เลยนะครับ ผมจะได้แก้ไข
คุยกันได้เลยครับ ไม่ต้องกลัวถูกหรือผิด
ผมไม่ได้รู้อะไรมากไปกว่าท่านอื่นๆเลยครับ
 
ปล. เกิดอะไรขึ้นหรอครับพี่นาย มีอะไรอะป่าว*-*


tapeza555 วันที่ส่ง: 19 พ.ค. 52 10:46 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 10:46 GMT+7
REPLY #24 (106538)
มาต่อครับ จาก PL -->BLL-->DAL
 
ผมใช้ เครื่องหมาย --> นั่นคือหมายถึง เรียกใช้ หรือ referance นะครับ
เช่นผม บอกแยก 3 โปรเจ็ก จะได้ว่า
 
ASP.NET ---Referance--> Class Library(BLL) ---Referance--> Class Library(DAL)
 
หรือถ้าไม่แยก Project ก็ยังถือว่าเป็น Layer ได้นะครับ เช่น
เราแบ่ง Folder ไว้ใน App_Code ของ ASP.NET และก็แบ่ง namespace BLL,DAL เอา
 
แล้วแยก Project กับไม่แยก มันต่างกันตรงไหน ??
ก็ในเรื่องของการใช้งานครับ ถ้าเราแยกโปรเจ็ก เราก็จะได้ BLL,DAL ในรูปของ Assemply(*.dll)
ซึ่งเราเอาตรงนี้ไปใช้กับ Window App ได้จริงใหมครับ
 
ก่อนที่จะข้ามตรงนี้ ผมจะ Focus ไปที่ Code ครับ
 
//Presentation Layer
 protected void btnSaveReservation _Click( object sender, EventArgs e ) {   
         //สมมุติครับอะไรประมาณนี้

          ReservationManager reservationManager = new ReservationManager();

          reservationManager.Save(txtCustomerNo.Text,Convert.ToDateTime( txtReservationDate.Text ) ); 

 }
 
//Business Logic Layer  ใน Code ส่วน ของ PL ก่อนหน้านั้นก็จะอยู่ใน BLL
public class ReservationManager {
        public void Save(string customerNo , DateTime reservationDate){
            // ซึ่งตรง Code ส่วนนี้อาจมีการ Validate อะไรต่างๆ รวมถึงสิทธิอื่นๆ ก่อน Save ครับ
             using(TranscationScope ts = new TranscationScope()){

                  ReservationDao dao = new ReservationDao();

                  dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );

                  //ทำอะไรอย่างอื่น
                  XXXDao xDao = new XXXDao();
                  xDao.Save( x );

             }          

        }
}
 
ปกติแล้ว ถ้าไม่มี BLL Code ที่ Check เกี่ยวกับ Logic ของระบบ  
บางทีมันจะกระจายในส่วนของ PL , DAL ถ้าเรามี BLL เราก็จะรวม
Code ที่ต้อง Check พวกนี้ไว้ใน BLL ทำให้เรา Reuse ได้ง่ายขึ้น
เช่น
 
//Presentation Layer
 protected void btnSaveReservation _Click( object sender, EventArgs e ) {   
        DateTime  reservationDate = Convert.ToDateTime( txtReservationDate.Text );
        if( reservationDate >= DateTime.ToDay)  {
              ReservationManager reservationManager = new ReservationManager();

              reservationManager.Save( txtCustomerNo.Text, reservationDate ); 

        else{
             throw new Exception( "Reservation Date is not valid ." );
        }

 }

ถ้าเกิดต้องมีปุ่ม Save หลายๆๆที่ หรือ หลาย Page Code ตรง Validate ตรงนี้ก็ต้องถูก Copy ไปทุก Page
หากเราเปลี่ยนเงื่อนๆไขเป็น reservationDate > DateTime.ToDay ก็ต้องไปแก้ทุกหน้า
แบบนี้เราก็ย้ายส่วน Validate ไปไว้ใน BLL
 
//Presentation Layer
 protected void btnSaveReservation _Click( object sender, EventArgs e ) {   
        // ยังคงเรียกใช้ เหมือนเดิม

          ReservationManager reservationManager = new ReservationManager();

          reservationManager.Save(txtCustomerNo.Text,Convert.ToDateTime( txtReservationDate.Text ) ); 

 }
 
//Business Logic Layer
public class ReservationManager {
        public void Save(string customerNo , DateTime reservationDate){
            if( reservationDate < DateTime.ToDay)  {
                 throw new Exception( "Reservation Date is not valid ." );
            }
 
          using(TranscationScope ts = new TranscationScope()){

                  ReservationDao dao = new ReservationDao();

                  dao.Save( Convert.ToDateTime( txtReservationDate.Text ) );

                
                  XXXDao xDao = new XXXDao();
                  xDao.Save( x );

             }          

        }
}
 
 
ปล. ก็คงประมาณนี้มั้งครับ ผมไม่แน่ใจว่า การเขียน BLL
ในลักษณะนี้ มันเรียกว่า Transction Script Pattern (PoEAA) หรือป่าว
ผมก็ยังมองว่าเป็นการเขียนในลักษณะของ  Procedural Programming
 


tapeza555 วันที่ส่ง: 19 พ.ค. 52 11:35 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 11:35 GMT+7
REPLY #25 (106540)
เอารูปมาฝาก
สำหรับ .Net เรามี DataSet ,LINQ to SQL ,EF มาช่วยทำ DAL
 
2-Layer
 
3-Layer
 


tapeza555 วันที่ส่ง: 19 พ.ค. 52 11:53 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 11:53 GMT+7
REPLY #26 (106543)

    ก่อนที่จะไปเรื่องอื่น ตั้งแต่ต้น ผมจะใช้คำว่า Layer เท่านั้นไม่เอ่ยว่า Tier เลย

ซึ่งถ้าเรียน Comsci คงเคยได้ยิน ว่า Tier เช่น 3-Tire อะไรประมาณนี้
แล้วมันต่างกันยังไง  มันเป็นยังไง ???
 
Tier vs Layer
 
    สำหรับ Layer ก็คือการแบ่ง Concept หรือหน้าที่ ของแต่ละส่วนให้ แยกการทำงานออกจากกัน
เช่น ส่วนของการแสดงผล(PL) , ส่วนของการติดต่อ Datasource(DAL) ซึ่งอาจแยกโดยการ
แบ่ง Folder หรือ Namespace เพื่อให้เป็นสัดส่วน หรือไม่ก็แยกออกมา
เป็นโปรเจ็กในรูปของ Class Library ไปเลย
   
    สำหรับตัว Tier จะมองในลักษณะของ hardware พูดแบบนี้น่าจะง่ายดี
มองเห็นภาพมากขึ้น เช่น Computer, มี Network ในการเชื่อมต่อ
 
Presentation Tier <--->Business Tier <---> Data Tier
 
 
ซึ่งก็คงไม่ได้ fix ว่ามันจะต้องชื่อนั้น ชื่อนี้ ในรูป นี่เป็นตัวอย่าง รู้สึกผมเอามาจาก
Codeproject แต่จำ Url ไม่ได้ ต้องขอโทษ ที่ไม่ได้ reference
 
ใน Tier หนึ่งๆ อาจมีได้มากกว่า 1 Layer หรือ บาง Layer อาจอยู่ 2 Tier
เช่น Business Logic มีทั้ง Business Tier กับ Data Tier(Store Procedure ) อะไรประมาณนี้
 
อันนี้ต้องแล้วแต่คนที่ออกแบบว่าต้องการทำอะไร ทำเพื่ออะไร ทำไมต้องทำแบบนี้  นี่สิสำคัญ
อันนี้ต้องไปถาม Architecture ตัวจริงอะครับ จะได้ทราบข้อเท็จจริง *-*
 
    แต่ยิ่งมีการแบ่ง Tier มากขึ้น ก็จะยิ่งทำให้ Performance ตกลงมา
แต่ถ้ามองในเรื่อง Security ก็อาจจำเป็นต้องแบ่ง เป็นต้น ซึ่งตรงนี้
ผมก็ยังไม่ได้มีประสบการณ์อะไร เพียงแค่พูดพอเป็นแนวทางครับ
 
พอแค่นี้ดีกว่าเหนื่อย (>_<)
 


tapeza555 วันที่ส่ง: 19 พ.ค. 52 13:14 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 13:14 GMT+7
REPLY #27 (106546)
Layer ชื่อก็บ่งบอกในตัวแล้วครับ เป็นการแยกกลุ่มการทำงาน ออกจากกันเป็นชั้น ๆ จะดูตาม functionality ของ module

แต่ละ Tier ก็มี layer ของตัวเองครับ เนื่องจาก System ที่จะรันตัวเองขึ้นได้ จะมี functionality module ที่หลาย ๆ ส่วนประกอบกัน เราเองก็สามารถแยกการทำงานเหล่านั้นออกเป็น layer ได้อีก


Nine (นาย) วันที่ส่ง: 19 พ.ค. 52 13:58 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 13:58 GMT+7
REPLY #28 (106547)

ขอบคุณมากครับ พี่ Nine อธิบายสั้นๆ แต่กระจ่าง เข้าใจง่ายดีครับ

 



tapeza555 วันที่ส่ง: 19 พ.ค. 52 14:01 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 14:01 GMT+7
REPLY #29 (106548)

อ่อ ลืมบอกประเด็นหลัก ที่ผมเขียน Blog นี้กับทุกท่านนะครับ

วันนี้ที่ผมเขียน ไม่ได้หมายความว่ามันจะถูก นะครับ อ้าว ฮา
เพียงแต่เป็นการมาคุยกันมากกว่า เพื่อที่เราจะได้คำตอบที่ดีที่สุดครับ
ดังนั้นคุยกันได้เต็มที่เลย ขำๆ ไม่ซีเรียด ครับผม  


tapeza555 วันที่ส่ง: 19 พ.ค. 52 14:10 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 14:10 GMT+7
REPLY #30 (106549)
เออ น้องเทป ไปรับของที่ คุณมี่ ด้วย เป็น benefit จาก GF (มี่)


Nine (นาย) วันที่ส่ง: 19 พ.ค. 52 14:12 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 14:12 GMT+7
REPLY #31 (106550)

ขอบคุณมากๆๆ ครับผม ขอบคุณพี่มี่ ,พี่นาย ,อ. และก็ GF ด้วยครับ

เคยเห็นตอนที่พี่ nano ,พี่ Mr.L ที่เคยได้ตอนนั้นแล้ว
ก็แค่ยินดีกับพี่เค้า ไม่คิดมาก่อนเลยจะได้ 
ขอบคุณอีกครั้งครับ


tapeza555 วันที่ส่ง: 19 พ.ค. 52 14:19 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 14:19 GMT+7
REPLY #32 (106551)
อืม อันสุดท้าย ของปีก่อนหนะ ใช้ปีนี้ก็ได้เล่น VS 2010 ฟรี ๆ ละน้อง หุหุ
ปล. ค่อย register ซักท้าย ๆ ปี น่าจะดี รอของใหม่ ๆ ออกก่อน


Nine (นาย) วันที่ส่ง: 19 พ.ค. 52 14:21 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 14:21 GMT+7
REPLY #33 (106574)
ไม่ค่อยมีเวลาเข้าเลย กลับบ้านก็ 2 ทุ่มละ(อาจจะกว่านิดๆ) ทำไรเสร็จก็ 4 ทุ่ม ก็จะได้เวลานอนพอดี แต่ก็พยายามติดตามทวงหนี้อยู่เรื่อยๆครับ หุ หุ หุ


notarry วันที่ส่ง: 19 พ.ค. 52 23:26 GMT+7
วันที่ปรับล่าสุด: 19 พ.ค. 52 23:26 GMT+7
REPLY #34 (106577)

ยีนดีด้วยครับ น้องเทปซ่าห้าห้าห้า

Blog นี้มีประโยชน์ครับ


nano วันที่ส่ง: 20 พ.ค. 52 00:28 GMT+7
วันที่ปรับล่าสุด: 20 พ.ค. 52 00:28 GMT+7
REPLY #35 (106591)
ดีมากเลยครับ เนื้อหาตรงกับการทำงานจริงเลย :)
 
 


Nameless วันที่ส่ง: 20 พ.ค. 52 09:54 GMT+7
วันที่ปรับล่าสุด: 20 พ.ค. 52 09:54 GMT+7
REPLY #36 (106596)
ผมตกข่าวน่ะครับ ว่าแต่ได้อะไรครับ MVP เหรอครับ


notarry วันที่ส่ง: 20 พ.ค. 52 10:36 GMT+7
วันที่ปรับล่าสุด: 20 พ.ค. 52 10:36 GMT+7
REPLY #37 (106653)

ให้สิ่งนี้ครับ กระดาษดำๆ แข็งๆ แผ่นนึง มันคือ Visual Studio Team Suite 2008 พร้อม MSDN Subscription 1 ปี ครับ
License ของแท้ ให้ไปเลย   และก็ได้ให้ ไปแล้ว  ราคาไม่กี่แสนบาทครับ เล็กน้อย 
ผมให้เป็นกำลังใจ แก่น้องเทป ครับ เอาไว้ต่อยอด ความรู้ต่อไป
 
*ขอบคุณรูปจาก coresharp.net ครับ แอบจิ๊กมาใช้


mie วันที่ส่ง: 21 พ.ค. 52 00:02 GMT+7
วันที่ปรับล่าสุด: 21 พ.ค. 52 00:02 GMT+7
REPLY #38 (106666)
ยินดีด้วยครับ น้อง Tap อุอุ


mr.l วันที่ส่ง: 21 พ.ค. 52 01:19 GMT+7
วันที่ปรับล่าสุด: 21 พ.ค. 52 01:19 GMT+7
REPLY #39 (106672)
ขอบคุณทุกๆคนอีกครั้งครับ


tapeza555 วันที่ส่ง: 21 พ.ค. 52 09:14 GMT+7
วันที่ปรับล่าสุด: 21 พ.ค. 52 09:14 GMT+7
REPLY #40 (106723)

จาก REPLY #20 (106519)

 

จาก Reply ที่ #20(106519)
"...การคุม Transaction ก็น่าจะโยนให้ Layer ที่อยู่เหนือกว่า เป็นคนจัดการไปครับ นั่นก็คือ  Presentation Layer ..."
 
 
ผมเคยอ่านเจอว่า เราสามารถที่จะใช้ Service Layer จัดการในเรื่อง Transaction และเรียกใช้ Business Object ต่าง ๆ เพื่อลดจำนวนที่ call จาก PL มาที่ Server โดยใช้ Facade Pattern มาช่วย แล้วใช้ DTO รับส่งระหว่าง Layer 
 
วิธีนี้มีข้อดีข้อเสียอย่างไรบ้างครับคุณ tapeza555
 
 
จากตัวอย่างของคุณ Sand King ถ้าจะรวมเรื่อง Service Layer, DTO เข้าไปด้วยจะดีมากครับ ตอนนี้ผมกำลังเริ่มศึกษาเรื่องนี้อยู่ แต่ก็ยังไม่เข้าใจสักทีครับ


Jericho วันที่ส่ง: 21 พ.ค. 52 20:15 GMT+7
วันที่ปรับล่าสุด: 21 พ.ค. 52 20:15 GMT+7
REPLY #41 (106733)

ผมนิยาม Facade Pattern คือ Class ที่เอางานย่อยๆ มายำรวมกัน

 
งง ?????
 
ในงานหนึ่งอย่าง เรามักจะมีระบบย่อยๆ ออกมา เช่น ระบบ ERP ต้องมีระบบจัดซื้อ ระบบผลิต ต้องมี QC ซึ่งถ้าเราต้องมาไล่เรียงการทำงานของระบบย่อยๆ ทุกครั้ง ต้องลงรายละเอียดทุกๆ เรื่อง อาจทำให้จุกได้ครับ บางทีมองภาพรวม (High Level) แล้วเห็นผลลัพธ์เลย ก็เข้าใจได้ง่ายกว่า ตัวอย่างโค้ดเช่น
 
PurchasingSystem purSys = new PurshasingSystem();
RawMat[] rawMats = purSys.purchaseRawMatForProduct("TV");

ProductionSystem prodSys = new ProductionSystem();
Product tv = prodSys.produce("TV",rawMats);

QCSystem qcSys = new QCSystem();

if(qcSys.checkQuality(tv) > 80){
    LogisticSystem logistSys = new LogisticSystem();
    logistSys.delivery(tv);
}
 
คนที่เป็นลูกน้องต้องรู้รายละเอียดเยอะหน่อย แต่คนที่เป็นหัวหน้าคงมองแค่ภาพรวม จะให้มาลงละเอียดแบบนี้ ดูจะเสียเวลาไป
เขียนโปรแกรมก็เหมือนกันครับ บางครั้งเราอยากจะมองเป็นภาพรวม ไม่สนใจกระบวนการที่ซับซ้อน เอา Facade มาช่วยก็โอดี
บางคนอาจทำเป็น Function แล้วมาเรียกใช้เอา แบบนี้ก็เรียก Facade ได้เหมือนกันครับแต่อาจไม่เต็มปากนัก คราวนี้มาลองดูตัวอย่างที่ใช้งานจริงๆ กันดีกว่า ว่าจะทำยังไงได้บ้าง
 
public class OrderFacade{
    private PurchasingSystem purSys = new PurchasingSystem();
    private ProductionSystem prodSys = new ProductionSystem();
    private QCSystem qcSys = new QCSystem();
    private LogisticSystem logistSys = new LogisticSystem();
 
    public Product Order(string productName){
        RawMat[] rawMats = purSys.purchaseRatMat(productName);
        Product product = prodSys.product(productName,rawMats);
       
        if(qcSys.checkQuality(product) > 80){
            return logistSys.delivery(product);
        }
        return null;
    }
}
 
เวลาใช้งานก็
OrderFacade facade = new OrderFacade();
Product tv = facade.Order("TV");
รู้สึกว่าง่ายขึ้นรึเปล่าขึ้น เวลาใช้งานก็เข้าใจมากขึ้น หลักอย่างหนึ่งของ Facade คือ เราต้องประเมิน Process งานนั้นๆ ให้ได้ก่อนว่ามีขั้นตอนได้บ้าง และต้องใช้ระบบอะไรเข้ามาเกี่ยวข้องในกระบวนการนั้นๆ ไม่ใช่มีกี่ระบบก็เอามา ถ้าทำแบบนี้ Class จะบวมโดยไม่จำเป็นครับ และแทนที่ Facade จะทำให้เข้าใจระบบได้ง่าย กลับเป็นเพิ่มความยุ่งยากโดยไม่จำเป็นอีกด้วยครับ 
 
เรื่อง Service Layer รอคุณเทป มาเสริมแล้วกันนะครับ


Sand King วันที่ส่ง: 21 พ.ค. 52 23:04 GMT+7
วันที่ปรับล่าสุด: 21 พ.ค. 52 23:04 GMT+7
REPLY #42 (106736)

มาอ่านกระทู้ นี้ เข้า ใจ  เรื่อง DAL BLL PL ขึ้นเยอะเลย ครับ และผม เวลาเขียนโปรเจคก็ทำแบบนี้ด้วย รู้ว่าสึกว่า อาจจะ code หนักหน่อยแต่ก็ แก้ปัญหาง่ายดีครับ

 
คือพอดี อ.สอนพาเขียนแบบนี้  ไม่รู้ว่าที่ผมนำไปใช้จะตรงกับหลักการหรือเปล่านะครับ
 
         Website  >>>>  PL >>> BL >>> DL(LINQ) 
อ. สอนมางี้และเพิ่งลองใช้ได้สักสองสัปดาห์ ตอนที่เรียน งงมาก แต่พอ เข้าใจแล้วลองใช้รู้สึกว่า  มันทำให้แก้ปัญหาง่ายขึ้นเยอะเลยครับ
 
ที่อยากจะถามคือ   มันมีผลต่อ performance ของโปรแกรมที่เราเขียนด้วยมั้ยครับ
         
     


znalog วันที่ส่ง: 22 พ.ค. 52 00:02 GMT+7
วันที่ปรับล่าสุด: 22 พ.ค. 52 00:02 GMT+7
REPLY #43 (106748)

มีผลมั้ย ???


ผมว่ามีผลนะ แต่ด้วยระบบประมวลผลคอมพิวเตอร์ในปัจจุบันทำให้เราเหมือนไม่รู้สึกอะไร
สิ่งที่เกิดขึ้นมาจากการเขียนเป็น Layer อย่างหนึ่ง คือ Overhead ที่เพิ่มจากการเรียกใช้งาน Object ต่างๆ ผ่านแต่ละชั้น 
 
ยกตัวอย่างเช่น DTO ที่ผ่านไป ผ่านมาได้ทุกชั้น แต่ในบางชั้น อาจต้องมีการ Map ไปเป็น Domain Entity
หรือเอาจาก Domain มาจับใส่ DTO ขั้นตอนที่ทำซ้ำๆ พวกนี้ทำให้เกิด Overhead ขึ้นได้
อาจลองคิดเล่นๆ ก็ได้ครับ
 
ระหว่างที่เราได้ Entity จาก Database มา เราจับถ่ายค่าใส่ DTO เพื่อไปใช้งานใน PL แค่สร้าง Object มาก็เสียพื้นที่ในหน่วยความจำแล้ว
ถึงแม้ว่าท้ายสุดตัว Entity จะจบ Life Cycle ของมันแล้ว แต่ก็ไม่รู้ว่า GC จะมาเก็บเมื่อไร
ถ้าทำเยอะมากๆ ก็ทำเอา Memory Leak ได้เหมือนกัน
 
ที่สำคัญต้องไม่ลืมว่า การแบ่งเป็น Layer ช่วยแก้ปัญหาได้ แต่ก็ต้องแลกมากับจำนวนของ Class ที่ต้องดูแลมากขึ้นด้วย
ซึ่งทำให้เราต้องออกแบบดีๆ ลดความซ้ำซ้อนของโค้ดให้ได้มากที่สุด เวลาแก้จะได้ง่ายๆ ไม่ต้องลำบากเหมือนผมทุกวันนี้   
ดาบนั้นคืนสนอง เหมือนฆ่าตัวเองเลย Y_Y


Sand King วันที่ส่ง: 22 พ.ค. 52 09:15 GMT+7
วันที่ปรับล่าสุด: 22 พ.ค. 52 09:15 GMT+7
REPLY #44 (106785)
ยินดีด้วยครับ น้องเทป


ASPeXP วันที่ส่ง: 22 พ.ค. 52 14:55 GMT+7
วันที่ปรับล่าสุด: 22 พ.ค. 52 14:55 GMT+7
REPLY #45 (106807)

เลือก Architecture ให้เหมาะสมกับงานครับ หยิบมาปะมาแปะใช้ให้งานเกิดความคล่องตัวยืดหยุ่นระดับหนึ่ง
เพิ่มเวลาเมนเทน อีกนิดก็ไม่เป็นไร เพราะเรา decoupling ระบบให้ ง่ายต่อการเมนเทน(จริงป่าวนี่)

PL - BLL - DAL กำลังดี เหมาะดีกับ Web App, Win App เดี่ยว ๆ
MPL - FQL - BLL - DAL กำลังสวย จัดการง่าย สำหรับระบบ เดี่ยว ๆ แต่มี client หลายประเภท
PL - BLL - DAL(+ISL) ไม่เกินไป สำหรับระบบที่ต้องคุยกับระบบอื่นด้วย
MPL - FQL - BLL - DAL(+ISL) จัดการง่ายอยู่ สำหรับระบบที่ต้องคุยกับระบบอื่น และมี client หลายประเภท

แต่อย่าให้หนาเกินไปมิเช่นนั้น develop time ก็ยืดยาวเช่นกัน

ในแต่ละ layer ก็จะมี component ต่าง ๆ แฝงไว้อีกมากมาย
ทั้งพวก infrasturcture framework (logging, security, utility, .. )
ไหนจะแยกย่อยอย่าง BP Component ที่แก้ไขได้อีก
ซึ่งจริง ๆ แยกอีก ก็จะได้ พวก DI ภายใน Layer นั้น ๆ อีกเหมือนกันครับ


ถ้าเรามัวแต่มองว่าระดับของ dto ที่คุยกันแต่ละ layer ต้อง define ให้ใหม่ทุกชั้น .... ตายแน่นอน ครับ
ผมมองแค่ว่า ถึงจะเป้น domain model ที่อยุ่ใน BLL ยังสามารถ อ้างข้ามไปจนถึง FQL ได้แน่นอน
ลดเวลาเมนเทน ส่วน overhead มีแน่นอน แต่เราก็ใส่ค่าเฉพาะที่ property ที่ต้องการ กลับขึ้นไปในแต่ละ business method ก็ได้ครับ
พอจะเป็น FQL ค่อยใช้ DTO คุยไปยัง MPL แบบนี้ ง่ายกว่าครับ protect business ของ ระบบได้ด้วย
ความหมายคือ เมื่อ data จะออกจากระบบ ค่อยแปลงสาร ไปเป็น DTO ไปคุยกับด้านนอก
โดยผมถือว่า PL ก็ถือเป็นด้านนอกเช่นกัน


เห็น post มายาวนานกับ Software Architect เลยต้องแวะเข้ามาบ่น ๆ ๆ ๆ บ้าง อิอิ
จบละ กลับบ้าน หุหุ



Nine (นาย) วันที่ส่ง: 22 พ.ค. 52 20:40 GMT+7
วันที่ปรับล่าสุด: 22 พ.ค. 52 20:40 GMT+7
REPLY #46 (106832)
ยินดีด้วยครับ เดี๋ยวว่างๆจะมาอ่านบทความย้อนหลังครับ ตอนนี้ยังไม่ค่อยว่าง อยากอ่านตอนว่างๆ จะได้ค่อยๆทำความเข้าใจ


notarry วันที่ส่ง: 22 พ.ค. 52 22:45 GMT+7
วันที่ปรับล่าสุด: 22 พ.ค. 52 22:45 GMT+7
REPLY #47 (107001)
Application Architecture ( ต่อ )
 
หายไปแป๊ป เดียว พอมาดูอีกที ..ยาวเลย   ก่อนอื่น ผมต้องขอสรุป สิ่งที่ได้คุยไปก่อนหน้านี้นะครับ
เพื่อที่ท่านอื่นมาดู จะได้อ่านตามได้ ...
 
เราได้พูดถึง การแบ่ง Application เราออกเป็น Layer ซึ่งตอนนี้ เป็น 3- Layer ดังนี้
ซึ่งผมขอแยก เป็น 3 โปรเจ็กไปเลยจะได้เห็นภาพ
 
----------------------
Presentation Layer(Window App, Asp.Net ,ส่วนแสดงผล )
----------------------
Business Logic Layer( Class Library : เป็นส่วนที่มีการคำนวณของระบบ หรือพวกข้อกำหนดต่างๆของระบบที่เราเขียนขึ้น )
----------------------
Data Access Layer ( Class Library : ส่วนที่ติดต่อ กับ DataSource,DataBase ,คำสั่ง SQL กรณีเขียนติดต่อเอง )
---------------------
 
การ Reference ก็จะเป็นแบบนี้ครับ
PL--->BLL --->DAL
 
ย้อนกลับมาที่คำถามของคุณ Jericho (REPLY #40 (106723) )
ก่อนอื่น ผมขอคุยถึง เรื่อง คำศัพท์หลายๆ คำที่คุณ Jericho  ได้พูดถึงสักเล็น้อย
สำหรับหลายๆ เพราะท่านบางทีไม่เคยได้ศึกษาว่ามันคืออะไร
ผมเกรงว่าเดี๋ยวจะกลายเป็นว่า คุยกันแค่ คนสองคนครับ
 1. Service Layer
 2. Business Object
 3. Facade Pattern
 4. DTO
 และอื่นๆ
 
อึม....ชักจะเริ่มเข้าเรื่องยากแล้ว อย่างที่เคยบอกไว้ว่า มันเกี่ยวข้องกับหลายๆ เรื่อง  
งั้นถ้ามองซัก 3- Layer
ลองมา Foucus ที่ Business Logic Layer (BLL ) ก่อนแล้วกันครับ
 


tapeza555 วันที่ส่ง: 25 พ.ค. 52 02:41 GMT+7
วันที่ปรับล่าสุด: 25 พ.ค. 52 02:41 GMT+7
REPLY #48 (107002)
#Foucus to Business Logic Layer# 
 
 Presentation Layer (PL)---> Business Logic Layer (BLL) --> Data Access Layer (DAL )
 
จาก ที่ได้เขียนไปแล้วด้านบน REPLY #24 (106538)  ที่ฝั่ง Presentation  จะมีการเรียกใช้ Class ฝั่ง Business Logic
ประมาณนี้
//ASP.NET
 protected void btnSaveReservation _Click( object sender, EventArgs e ) {     

          ReservationManager reservationManager = new ReservationManager();

          reservationManager.Save(txtCustomerNo.Text,Convert.ToDateTime( txtReservationDate.Text ) ); 

 }
 
หุหุ Method Save เรานี่ชางหน้าตาดูไม่ค่อยได้เลย ยังขัดๆตา กับ OO ของเราจริงๆ 
แล้วใน Business Logic ก็มีการคุม Transaction ไว้ในนั้น *-* อึมๆๆๆ...จะดีหรอแบบนี้
 
 // อึม แบบนี้ค่อยดูดีขึ้นหน่อย
 protected void btnSaveReservation _Click( object sender, EventArgs e ) {     

          ReservationManager reservationManager = new ReservationManager();

          Reservation reservation = new  Reservation ();

          reservation.Customer =  new Customer ( txtCustomerNo.Text );

          reservation .ReservationDate = Convert.ToDateTime( txtReservationDate.Text );           

          reservationManager.Save( reservation  ); 

 }
 
หุหุ *-* เพิ่งดูเวลา ตี 3.16 เดี๋ยวพรุ่งนี้ไม่ตื่น ไว้มาเขียนต่อละกันครับ
 


tapeza555 วันที่ส่ง: 25 พ.ค. 52 03:07 GMT+7
วันที่ปรับล่าสุด: 25 พ.ค. 52 03:07 GMT+7
REPLY #49 (107008)

โอ้...  คนเก่งมักจะนอนดึกอย่างนี้นี่เอง

พักผ่อนด้วยนะครับ จะได้มีแรงเขียนต่ออะครับ ... หงิๆ...



nano วันที่ส่ง: 25 พ.ค. 52 08:07 GMT+7
วันที่ปรับล่าสุด: 25 พ.ค. 52 08:07 GMT+7
REPLY #50 (107099)

คืออยากจะเรียนถาม นะครับ คือ ตอนนี้ ผมทำเป็นแบบ

DAL
    ผมใช้ LINQ  ในการ insert update select delete ข้อมูลในแต่ละ table ที่จะใช้งานแบบ simple
BLL
    ผมใช้เรียก DAL อีกทีในบางครั้งที่อยากจะ Insert หลายๆ ครั้ง หรือคำนวนต่างๆ
PL
    ก็ใช้ปรกติ
 
ไม่ทราบว่าทำถูกมั้ย แล้วอีกอย่าง ผมต้องใช้ Webservies ด้วยนะครับ แต่เป็น ผู้เรียกใช้ คือดึงมาอีกที
 
ไม่ทราบ่วา Services ควรเข้าไปอยู่ใน Layer ไหนครับ


znalog วันที่ส่ง: 26 พ.ค. 52 00:49 GMT+7
วันที่ปรับล่าสุด: 26 พ.ค. 52 00:49 GMT+7
REPLY #51 (107100)
QUESTION :
 
DAL :  ผมใช้ LINQ  ในการ insert update select delete ข้อมูลในแต่ละ table ที่จะใช้งานแบบ simple
  
  - ครับ ผมมอง LINQ to SQL ,EF ,DataSet ,NHibernate ว่าเป็นส่วนของ DAL ครับ
 
BLL :  ผมใช้เรียก DAL อีกทีในบางครั้งที่อยากจะ Insert หลายๆ ครั้ง หรือคำนวนต่างๆ
 
- ที่กรณีจะ Insert หลายๆ ครั้ง นี่ผมยังไม่ค่อยเข้าใจนะครับว่าหมายถึงอะไร
  แต่ปกติ แล้ว มันจะ Link กัน แบบนี้ครับ
 
   layer บน ------------layer กลาง ------------  layer ล่าง
   [ PL ]--reference --> [BLL]--reference -->[ DAL]
 
Layer บนจะไม่กระทบ ถ้า เปลี่ยนหรือแก้ไข Layer ด้านล่าง
ให้มองว่าวันนี้เราใช้ Inernet เราส่งเมล เราไม่หรอกว่ามันวิ่งผ่าน
สายอะไรบ้าง Fiber ,Cable .. ใครไปเปลี่ยนสายเราก็ไม่รู้ อะไรประมาณนี้*-*
 
ดั้งนั้น คงไม่เกี่ยวกับว่าจะ Insert หลายครั้งหรือป่าว ยังไง PL ก็เห็นได้เฉพาะ BLL(ในต.ย. นี้นะครับ)
 
PL  :  ก็ใช้ปรกติ
  ก็คงงั้นครับ ทาง PL ก็เรียกใช้ Framwork หรืออื่นๆ
  ของ PL ไป jQuery ,AJAX, Silverlight...(ASP.NET)
 
 
-ผมต้องใช้ Webservies ด้วยนะครับ แต่เป็น ผู้เรียกใช้ คือดึงมาอีกที ไม่ทราบ่วา Services ควรเข้าไปอยู่ใน Layer ไหนครับ
ประเด็นคือ ให้คุณ มองแยก ว่าเรา แบ่ง แต่ละ Layer เพื่อ แยกการทำงานออกจากกันให้ชัดเจน
 
Webservies ????
ปกติ มันเป็นการเอา Data มาแสดง หรือ ทำอะไรสักอย่างกับ Data  
ซึ่งมักจะอยู่มันอยู่ที่อื่น  ให้เราลองมองว่ามันน่าจะอยู่ที่ Layer ใดถึงจะใกล้เคียงสุด
 
PL ---> ฝั่งแสดงผล   X ----> ผมว่าเอาไว้แสดงผลอย่างเดียวอะดีแล้ว เกิดวันนึงเปลี่ยนจาก ASP.NET
           ทำเป็น Window App งั้น Code ที่เรียกใช้ Ws ก็ต้องเขียนใหม่อีก *-*
BLL ---> ก็ให้มองว่าวันนี้คุณเขียนโปรแกรมอะไร เช่น Ecommerce มันก็จะมี Order,Customer,
            มีข้อกำหนด ที่ user จะบอกเกี่ยวกับ ระบบ Ecommerce ที่จะพัฒนา ซึ่ง
            ไม่เกี่ยวกับว่าจะใช้ DataBase อะไร ,ใช้ PHP ,ASP.NET พอเห็นภาพขึ้นใหมครับ
 
DAL ---> วิธีการติดต่อ DataSouce ,Database จัดไปเลยครับ LINQ to SQL ,EF ,DataSet ,NHibernate
              เขียนเองก็ได้
 
ถ้าให้ผมมอง ก็เหลือ แค่ 2 Layer ที่ น่าจะไว้ คือ BLL ,DAL
 
งั้นผมขอเลือก ไว้ที่ BLL ละกันครับ เผื่อเอาข้อมูลจาก Ws มาทำอะไรแล้วค่อยส่งต่อไปยัง PL
เพราะ 3-Layer นี่ ผมยังมองว่าน่าจะคุม Transction ที่ BLL ครับ
 
คือจริงๆ ผมก็ต้องออกตัวก่อนว่าไม่ได้เก่งอะไรนะครับ ท่านอื่นคิดว่ายังไง แลก
เปลี่ยนความคิดกันได้ครับ
 
ปล.
- สงสัย Blog นี้คงเอาไว้เขียน Architecture อย่างเดียวแล้วกันครับ รู้สึกจะยาว
- บางทีต้องขอโทษที ที่เขียนบ้างหยุดบ้าง หรือไปช้าสักหน่อย  อยากให้ได้คุยกันได้หลายๆ
   คนอะครับ ไม่อยากข้ามไป Design pattern เลย เดี๋ยวจะงง นี่ขนาดเลี่ยงที่จะพูดเรื่อง OO
   ยังเหนื่อยเลย มันต้องใช้พลังงานสูงอะครับ
  ถ้าท่านใดมีคำถาม หรือ อยากแลกเปลี่ยนความคิดเห็นได้เต็มที่เลยนะครับ ยิ่งคุยกัน
  ยิ่งได้ความรู้ครับ
 
- ใครพอให้คำจำกัดความของคำพวกนี้ทีครับ
พอดี ผมพยายามเลี่ยง คำศัพท์เกี่ยวกับ BLL  เลยทำให้คำอธิบาย BLL  มันฟังแล้วมันแหม่งๆๆไป
  Business Logic ?
  Business Rule ?
  Business Constant ?
 
- อันนี้ผมยังไม่ได้พูดถึง N-Layer เลยเอา Ws มาฝากไว้แบบนี้ก่อน  ไว้คุยถึงตรงนั้น แล้วค่อยว่ากันครับ
- BLL ของผม ค่อนข้างจะ reference อะไรไม่รู้เยอะไปหมด ไว้ถึงตอนที่คุยเรื่อง Domain Model ,
  POCO /Persistence Ignorant ,Test-Driven Design ,Domain -Driven Design , DTO ,MVC ค่อยมารื้อกันใหม่ครับ
- เห็นมีการคุยเรื่อง Interface ที่ http://greatfriends.biz?106967 น่าสนใจดีครับ
 ไว้คงได้คุยเรื่องนี้ด้วย ใน Seperation Interface
 
ตอบคำถามเลยยังไม่ได้ต่อ Focus to Business Logic Layer   นะครับ
หมดแรงแล้ว
 


tapeza555 วันที่ส่ง: 26 พ.ค. 52 03:30 GMT+7
วันที่ปรับล่าสุด: 26 พ.ค. 52 03:30 GMT+7
REPLY #52 (107101)

โอ้...  คนเก่งมักจะนอนดึกอย่างนี้นี่เอง

พักผ่อนด้วยนะครับ จะได้มีแรงเขียนต่ออะครับ ... หงิๆ...
 
แฮะๆๆๆ ผมไม่เก่ง อะไรหรอกครับ พี่ nano มั่วไปวันๆๆ ผิดก็แก้ใหม่ให้ถูกครับ
ไม่ซีเรียด ไม่กลัวปล่อยไก่ หรือ ไม่กลัวหน้าแตกด้วย  นี่แหละ Style  ผม 555+
 
อ่อ ถ้ารอผมเขียนไม่ไหว ลองดูที่  REPLY #33 (99432)
ผมเคยฝาก Resource เอาไว้ครับ เผื่อท่านอื่นยังไม่เคยเข้าไปดูนะครับ
แยกให้คุยกันเยอะๆ พยาพยามปลุกกระแส *-* คือ ผมอยากได้แนวคิดของ
แต่ละท่านอะครับ แล้วค่อย เขียนใหม่ สรุป แบบให้มันอ่านง่ายๆๆ 
 
ปล. ไม่รู้ว่ามีใครอยากให้เขียนเกี่ยวกับ ASP.NET(Prenatation Layer ) ต่อใหม
    จะได้แอบแว่บไปเขียนต่อ ยังเขียน popup ไม่จบเลย *-*
 -อ่อ Nine (นาย)  MPL - FQL -ISL มันย่อมาจากอะไรบ้างอะครับ ช่วยอธิบายเพิ่มติมหน่อยครับ
 
 


tapeza555 วันที่ส่ง: 26 พ.ค. 52 03:47 GMT+7
วันที่ปรับล่าสุด: 26 พ.ค. 52 03:47 GMT+7
REPLY #53 (107105)
อย่าเพิ่งเขียนเยอะครับ อ่านไม่ทัน หุ หุ หุ


notarry วันที่ส่ง: 26 พ.ค. 52 08:28 GMT+7
วันที่ปรับล่าสุด: 26 พ.ค. 52 08:28 GMT+7
REPLY #54 (107113)
Multiple Presentation Layer, มากกว่า 1 ชนิดค้าบ น้องเท้ป
Facade Layer นั้นเอง (จริง ๆ พิมพ์ผิด จะให้ชื่อ FCL ช่างมัน เราตั้งใหม่กันได้ เหอ ๆ )
Integrated Service Layer ส่วนที่นำ Data เข้าจาก System อื่น ๆ หลาย ๆ ทาง หลาย ๆ แบบ จ้าา


Nine (นาย) วันที่ส่ง: 26 พ.ค. 52 09:49 GMT+7
วันที่ปรับล่าสุด: 26 พ.ค. 52 09:49 GMT+7
REPLY #55 (107115)
อ่อ ขอบคุณครับพี่ Nine (นาย)


tapeza555 วันที่ส่ง: 26 พ.ค. 52 10:14 GMT+7
วันที่ปรับล่าสุด: 26 พ.ค. 52 10:14 GMT+7
REPLY #56 (107162)

เปิดกระทู้ได้มีสาระ และน่าติดตามดี

มาออกแรงช่วยขุดด้วยคน
 
แล้วก็ขอเป็นคนถามสักประเด็นด้วยเลยละกันนะครับ
ที่คุย  ๆ กันเกี่ยวกับเรื่องการแบ่ง layer โดยปกติส่วนใหญ่แล้วใช้การแบ่งแบบนี้
 
[ PL ]--reference --> [BLL]--reference -->[DAL]
 
เลยอยากจะถามว่า...
 
ส่วนของ DAL นี้จะรู้จักโครงสร้างข้อมูล ที่ BLL (หรือ PL) โยนมาให้ได้อย่างไร
อย่างเช่นโยน object Customer เข้ามา ให้ DAL ทำหน้าที่เก็บลง database
 
ตัว Entity Customer นั้นจะอยู่ที่ layer ไหน แล้วถ้าเกิดว่ามีการนำ O/R Mapping (LINQ, EF) มาใช้
จะนำมาใช้ทดแทนได้อย่างไร เพื่อให้สามารถโยนขึ้นไปถึง presentation layer ได้
 
 
ไม่ค่อยเห็นมีการพูดถึงเกี่ยวกับโครงสร้างของ Entity ว่าจะไปอยู่ส่วนไหนของ layer ใด
แล้วจะนำไปใช้งานอย่างไร
เลยอยากขอความเห็นบ้าง ตอนนี้ก็ยังเป็นมือใหม่ แต่ก็สนใจในเรื่องนี้พอสมควรครับ


Caos วันที่ส่ง: 26 พ.ค. 52 17:48 GMT+7
วันที่ปรับล่าสุด: 26 พ.ค. 52 17:48 GMT+7
REPLY #57 (107218)

QUESTION :

 

อ้าว Caos หายไปไหนซะนานเลยไม่ค่อยได้เจอ  

ก่อนอื่นต้องขอตอบตรงนี้ก่อนแล้วกัน

 

1)ไม่ค่อยเห็นมีการพูดถึงเกี่ยวกับโครงสร้างของ Entity ว่าจะไปอยู่ส่วนไหนของ layer ใด

แล้วจะนำไปใช้งานอย่างไร

 

- ถูกต้องแล้วครับ 555+ ช่างสังเกตุ ดีจริงๆ  ตั้งแต่ที่ได้เขียนเริ่มจนถึง ณ ตอนนี้ ผมยังไม่ได้เข้าเรื่องจริงๆเลย

เหมือนกับเป็นแค่การเกริ่นๆ อะ  สังเกตุได้จากที่ Presentation Layer  ยังเรียกใช้ Business Logic   แบบนี้ อยู่เลย

      ReservationManager reservationManager = new ReservationManager();

      reservationManager.Save( txtCustomerNo.Text, Convert.ToDateTime(txtReservationDate.Text ) ); 

 

ซึ่งต่อจากนี้ไปครับถึง จะค่อยๆเริ่มเข้าเรื่อง ซึ่งๆกำลังจะเขียนต่อไป  (แต่หมดแรงซะก่อน   )

#Focus to Business Logic Layer #

 

แล้วจะย้อนกลับไปตอบคำถาม ที่ได้ ผ่านๆ มาครับ

ทั้งของคุณ Sand King ,คุณ Jericho ,คุณ znalog

เหมือนเป็น Step Step ไป เลยต้องขอโทษด้วยว่า อาจจะเขียนไปได้ช้าอะ

 

 

2)เกี่ยวกับเรื่องการแบ่ง layer โดยปกติส่วนใหญ่แล้วใช้การแบ่งแบบนี้

[ PL ]--reference --> [BLL]--reference -->[DAL]

 

เลยอยากจะถามว่า...

 

ส่วนของ DAL นี้จะรู้จักโครงสร้างข้อมูล ที่ BLL (หรือ PL) โยนมาให้ได้อย่างไร

อย่างเช่นโยน object Customer เข้ามา ให้ DAL ทำหน้าที่เก็บลง database

ตัว Entity Customer นั้นจะอยู่ที่ layer ไหน แล้วถ้าเกิดว่ามีการนำ O/R Mapping (LINQ, EF) มาใช้

จะนำมาใช้ทดแทนได้อย่างไร เพื่อให้สามารถโยนขึ้นไปถึง presentation layer ได้

 

- อันนี้ผมไม่รู้จะตอบยังไงดี ผมยังไม่ได้ LINQ to SQL , กับ EF เลย ท่านอื่นมีข้อเสนอเลยครับช่วยๆกัน

 แต่เอามุมมองผมก่อนละกัน ..

 

 LINQ to SQL /EF (EF นี่ผมยังไม่ได้ลองดูหลักการใช้อะ)

 ผมมองว่า มันมีการทำงานในลักษณะ Data-Driven  คือ เราต้องออกแบบ DataBase ก่อนแล้วก็ใช้ LINQ gen ออกมา

ได้เป็น Class( Entity ) ใช่ใหมครับ แล้วก็เอา Class พวกนี้ไปใช้

 

ถ้าเป็นแบบนี้ผมเลยมองว่ามันเป็นแค่ 2- Layer อะ

PL--->DAL

ทำไมผมจึงคิดแบบนี้ ???

ก็วันนึงผมไม่ใช้ LINQ แล้ว เปลี่ยนไปใช้อย่างอื่นหละ??? 

Entity Class พวกนี้จะยังคงใช้ได้อยู่ใหม ???

 

ส่วนการคำนวณและข้อกำหนด ต่างๆ (Business Logic)

มันก็จะไปอยู่ปนกันที่ทั้ง 2 Layer

 

ASP.NET (PL)                              LINQ to SQL(DAL)

-------------                                 -----------------

 

  *.aspx.cs     ------เรียกใช้------->  Class(Entity)

+ Business Logic                         + Business Logic

--------------                               ------------------

 

แบบนี้ก็จะตอบข้อนี้ได้เลยว่า ตัว Entity Customer นั้นจะอยู่ที่ layer DAL ครับ

แล้วถ้า 3-Layer จะเป็นยังไง

 

ASP.NET (PL)             Business Logic(BLL)          LINQ to SQL(DAL)

-------------              -----------------                   -----------------

 

  *.aspx.cs     --->    Class พวก Manager       ---> Class(Entity มีแต่ data)

                               (มีแต่ Method

                                แล้วเรียกใช้ Entity อีกที)

--------------             --------------------              ------------------

 

แบบนี้มันจะเป็นการเขียน Procedural Progamming Style ที่เราคุ้นเคยกันครับ

ซึ่งเรียกว่า Anemic Domain Model

และ Entity จาก LINQ to SQL มันก็จะเป็น แบบ Single Domain Model  ไป

 

แต่ที่ผมจะเขียน จะเป็นลักษณะ Domain-Driven Design 

และเป็นแบบ Rich Domain Model  ซึ่งจริงๆ มันคนละ Concept กับ Layer ต่างๆ

ที่ผมได้เขียนไปแล้ว 555+  

 

ปล. คำศัพท์พวกนี้ ยังไม่อธิบายนะครับ ตอนแรกกะว่าจะยังไม่พูดถึง ^^

 

 



tapeza555 วันที่ส่ง: 27 พ.ค. 52 12:16 GMT+7
วันที่ปรับล่าสุด: 27 พ.ค. 52 12:16 GMT+7
REPLY #58 (107221)

Interface

 มีการคุยเรื่อง Interface ที่
 http://greatfriends.biz?106967 น่าสนใจดีครับ
ขอแปะ Link ไว้ด้วยละกัน  
 
เดี่ยวมีได้ใช้แน่ครับเกี่ยวกับ การแบ่ง Layer


tapeza555 วันที่ส่ง: 27 พ.ค. 52 12:39 GMT+7
วันที่ปรับล่าสุด: 27 พ.ค. 52 12:39 GMT+7
REPLY #59 (107226)
สำหรับ LINQ To SQL คือ Code Gen Tool ดี ๆ นี่เองครับ

แต่สำหรับ ADO.NET EF ไม่ใช่ครับ

Focus ไปที่ MDD ครับ + Code Gen ไปด้วยในตัว

จะเลือก Rich Domain จะเลือก Anemic Domain
แนะนำให้ดูเรื่อง Business Layer มักมีปัญหาเรื่อง Change เสมอ
วิเคราะห์ตาม business และ framework ที่จะใช้ด้วยครับ
ก็มี framework หลายตัวออกมาช่วยแก้ไขปัญหาอยู่หลายตัว เช่น CSLA
ส่วนที่อยากให้ Focus
- Business Method
- Workflow Process
- Business Rule


Nine (นาย) วันที่ส่ง: 27 พ.ค. 52 13:35 GMT+7
วันที่ปรับล่าสุด: 27 พ.ค. 52 13:35 GMT+7
REPLY #60 (107692)
ขอบคุณมากๆครับพี่นาย สงสัยต้องรอสักพัก เดี๋ยวจะลองศึกษา EF ดูครับ
 
Question :
คือตอนแรก คำถามนี้กะตอบ หลังจาก เขียน เรื่อง Focus to Business Logic Layer
ไปแล้ว แต่รู้สึกเดี๋ยวมันจะยาว เลยเอามาตอบก่อนดีกว่า
 
Jericho :
REPLY #40 (106723)
 
ผมเคยอ่านเจอว่า เราสามารถที่จะใช้ Service Layer จัดการในเรื่อง Transaction และเรียกใช้ Business Object ต่าง ๆ
เพื่อลดจำนวนที่ call จาก PL มาที่ Server โดยใช้ Facade Pattern มาช่วย แล้วใช้ DTO รับส่งระหว่าง Layer  
 
 
 
- จากเดิมที่เราทำ 3- Layer สิ่งทีเราจะพบก็คือ ตัว Business Logic Layer(BLL)
ของเราจะ Reference กับ Data Access Layer(DAL)    แบบนี้
 
PL-->BLL--->DAL
 
ซึ่งทำให้ตัว BLL ต้องไปผูกกับ DAL โดยหากเราต้องการเปลี่ยน DAL จะส่งผลให้ต้องไปแก้ Code ในส่วนของ BLL ด้วย
ยิ่งถ้าเกิดเป็นระบบที่ใหญ่ๆ การแก้แบบนี้คงไม่ค่อย Work แน่ๆ และหากต้องการ Test ตัว BLL ก็จะทำได้ยากอีกด้วย
นั่นคือ หากให้ลำดับความสำคัญของแต่ละ Layer ตัว BLL จะถือว่าค่อนข้างสำคัญที่สุด
 ...เพราะเสมือนเป็นหัวใจของระบบที่เรากำลังพัฒนา
 
ผมมี 2 ทางเลือกให้ลองเลือกใช้ดูครับ
 
1) 3-Layer + Factory Method(Design Pattern ของ GOF ^^) ---> บวกกับใช้หลักการ Separated Interface ( Martin Fowler)
 
    PL---->BLL <----  DAL
    ^                             |
    |_________________|
 
Sample Code :
BLL:
 public class Order{ ..}
 public interface IOrderDao{   List<Order> GetAll();  }
 public interface IDaoFactory { IOrderDao GetOrderDao(); }
 
DAL:
    public class  SqlOrderDao : IOrderDao{...}
    public class  OracleOrderDao : IOrderDao{ ..}
   
   public interface DaoFactory  :  IDaoFactory {
            public IOrderDao GetOrderDao(){
                //  return new OracleOrderDao ();
                return new SqlOrderDao ();
            }
   }
 
 PL (ASP.NET)
   //Page Controller
  public abstact PageBase : Page {
        protected IDaoFactory DaoProvider{
                get{    
                        return new DaoFactory (); //ถ้าเปลี่ยน DAL สิ่งที่กระทบมากสุดจะเป็นตรงนี้
                 }
        }
  }
 

public partial class _Default : PageBase {

    protected void Page_Load( object sender, EventArgs e ) {

            if(!Page.IsPostBack ){

                    IOrderDao orderDao = base.DaoProvider.GetOrderDao();---> ตรงนี้ก็ Return เป็น Interface IOrderDao
                    gvOrder.DatasSource = orderDao.GetAll(); 
                    gvOrder.DataBind();

            }

    }

}

 
แบบนี้ถึงผมเปลี่ยน ตัว DAL ( LINQ to SQL,EF,NHibernate,หรือเขียนเอง ) ก็แทบจะไม่กระทบกับ PL /BLL เลย
(กระทบนิดหน่อยถ้าเปลี่ยน DaoFactory แต่ก็เอา PageBase มาช่วยลด จุดเชื่อมต่อระหว่าง DAL กับ PL ลงไป ทำให้แก้น้อยลง)
 
แบบนี้ BLL ก็ไม่ยึดติดกับ DataSource แล้ว ซึ่งถ้าใน BLL เราใช้ Class ที่เป็น Entity ต่างๆก็จะทำให้ Class
พวกนี้เป็น  POCO (Pain Old CLR Object) มันเป็นชื่อที่เลียนแบบ Java มาครับ (POJO)
ซึ่ง POCO   ฟังดูแล้วอาจจะต้องแปลอีก 2 -3 ตลบว่ามันคืออะไร *-*
 
ผมมีอีกคำที่ให้ความหมายเดียวกัน  แต่แล้วเข้าใจมากกว่าซึ่ง Jimmy Nilsson ได้ discussed กับ Martin Fowler
นั่นคือ   Persistence Ignorance (PI)   ประมาณว่า Object Entity ของเรา
ไม่ยึดหรือผูกติดกับ  วิธีในการเก็บ  นั่นเอง  ซึ่งน่าจะเข้าใจง่ายกว่า POCO
 
เป็นไงครับการใช้ Pattern มาช่วยเริ่มดูดี มีประโยชน์บ้างแล้ว ^^
 
2) 4-Layer (3-Layer + Service Layer )
 
    PL---->SL----->BLL<-----DAL
               ^                         |
                |______________|
 
หุหุ งานเข้าครับ ยังไม่ทันพูดถึง Service Layer   ,Facade pattern ไว้คราวหน้าละกัน


tapeza555 วันที่ส่ง: 2 มิ.ย. 52 15:49 GMT+7
วันที่ปรับล่าสุด: 2 มิ.ย. 52 15:49 GMT+7
REPLY #61 (107724)
1) 3-Layer + Factory Method(Design Pattern ของ GOF ^^) ---> บวกกับใช้หลักการ Separated Interface ( Martin Fowler)
 
    PL---->BLL <----  DAL
    ^                             |
    |_________________|
 
 
เราว่าน่าจะเป็น
 
    PL---->BLL <----  DAL
     |                            ^
     |________________|
 
อย่างนี้รึเปล่า
 


Caos วันที่ส่ง: 2 มิ.ย. 52 23:50 GMT+7
วันที่ปรับล่าสุด: 2 มิ.ย. 52 23:50 GMT+7
REPLY #62 (107725)
อึมๆๆ ใช่ๆๆ เขียนหัวลูกศรผิด *-* ขอบคุณมาก Caos


tapeza555 วันที่ส่ง: 2 มิ.ย. 52 23:56 GMT+7
วันที่ปรับล่าสุด: 2 มิ.ย. 52 23:56 GMT+7
REPLY #63 (107792)
ถ้ายาวมากๆจะขึ้น rep ใหม่ป่าวครับเนี่ย


notarry วันที่ส่ง: 3 มิ.ย. 52 22:39 GMT+7
วันที่ปรับล่าสุด: 3 มิ.ย. 52 22:39 GMT+7
REPLY #64 (108216)

จะว่างอะไรไหม ผมไม่อยากให้กระทู้นี้จากหายไปเลย

 
หรือ GF ควรมีกระทู้ประวัติศาสตร์ดี อิอิ
 
ผมเป็นคนหนึ่งที่หายจาก GF ไปนานมากเลย ผมจากกระทู้นี้จาก google นะ -*-


เฮียอ้วน วันที่ส่ง: 9 มิ.ย. 52 17:25 GMT+7
วันที่ปรับล่าสุด: 9 มิ.ย. 52 17:25 GMT+7
REPLY #65 (108220)

แต่ละกระทู้ รู้สึกว่าจะมีอายุ 365 วัน (1 ปี) ต้องเก็บ link เอาเองแล้วคร๊าบ...

แอบเก็บเรียบร้อยแล้วคร๊าบบบ


nano วันที่ส่ง: 9 มิ.ย. 52 19:50 GMT+7
วันที่ปรับล่าสุด: 9 มิ.ย. 52 19:50 GMT+7
REPLY #66 (108229)
ระวังโดนเก็บลิขสิทธิ์นะครับ หุ หุ หุ


notarry วันที่ส่ง: 9 มิ.ย. 52 22:26 GMT+7
วันที่ปรับล่าสุด: 9 มิ.ย. 52 22:26 GMT+7
REPLY #67 (108280)
Question(ต่อ ) :
 
อึม..ผมก็ยังไม่แน่ใจเลยครับ คุณ notarry   ว่าจะขึ้นใหม่ดีใหม  แต่คิดว่าคงเขียนแบบนี้ไปก่อน
แต่พวกที่เป็น Technical ,ASP.NET อะไรพวกนี้ อาจแยกใหม่เป็นอีกบทความไปเลย ครับ
 

แต่ถ้าอ่าน Reply เฉพาะ ชองผม นะ เรื่องจะไม่ค่อยโดดไปนู่นไปนี่มากอะ

คือ ผมพยายามลำดับให้มันครับ
แต่จริงๆ Blog นี้แค่ version Beta  อะครับ   ซะงั้น
 
ไหนๆ ก็ว่าจะศึกษาอะไรเพิ่มเติมอยู่แล้ว jQuery,Nhibernate,EF และอื่นๆ อีกมากมาย-

ก็อยากจะลองทำโปรเจ็ก เล่นๆดู

My Learning (^_^) --> GreatFriendsProject

 

จะดีใหม ถ้า GF มี ให้เขียน Blog ^^

จะดีใหม ถ้า GF มี Lismania แบบใน

http://greatfriends.biz/files/VT10-OOADCaseStudy-SuthepS.pdf

 

จะดีใหม ถ้า web สอน dotnet ใช้ dotnet พัฒนา 

เช่น

   GF use MVC Design(*-* ยากเกิ้น)

  ,GF use jQuery

  ,GF use Silverlive

  ,GF Theme selection

  ,GF Localize

  ,GF Application Architecture Design

  ,GF use Web 2.0 Design

  ,GF Live Demo

  ,GF Feed
  ,GF Chat
  มั่วไปเรื่อย *-*
 
แล้วใครสนใจ ก็จะถามแบบนี้แทน 

- คนอยากทำ Webbord ก็  อยากทำ Web board  แบบ GF ทำยังไง ??

- คนอยากทำ Theme ก็   อยากทำ Theme แบบ GF ทำยังไง ??
- ใช้ Master Page แบบ GF ทำยังไง *-*

- ใช้ FCKeditor และอื่นๆ.. ทำยังไง

 

แต่คงต้องใช้ความรู้เยอะแฮะ ตอนนี้ยังมีไม่พอ

แต่คืออยากศึกษาพวก jQuery,ASP.NET ,EF,LINQ 

ต้องศึกษา Web 2.0 ,Css  เพื่อ ให้ รองรับ IE,FF ..อื่นๆ

ไหนจะต้องออกแบบให้มัน สวยดูดี ใช้ง่าย*-*

ไหนจะเรื่อง OOAD & Architecture ที่ไม่เก่งเอาซะเลย  
แต่ถ้าทำไปเรื่อยๆ ก็คงดีขึ้นมั้ง
   

GF Domain Model

GF---->Forums

GF---->Courses

GF---->Blogs

GF---->Articles

GF---->Memberships
GF---->News
GF---->Shoping *-*
 

นี่ก็ว่าทำเล่นๆ ถ้าว่างก็จพะลองทำ แต่รู้สึกจะยุ่งตลอด 

 ===========================================

 

ไปไหนซะไกลเลย...เอ้ากลับมาเข้าเรื่อง ที่คุณ Jericho ได้ถามไว้ดีกว่า

 

Service Layer(SL) (ต่อ)

 

 4-Layer (3-Layer + Service Layer )

 

    PL---->SL----->BLL<-----DAL

               |                        ^

               |______________|

 

มาตอบคำถามต่อ

Jericho :

REPLY #40 (106723)

ผมเคยอ่านเจอว่า เราสามารถที่จะใช้ Service Layer จัดการในเรื่อง Transaction

และเรียกใช้ Business Object ต่าง ๆ เพื่อลดจำนวนที่ call จาก PL มาที่ Server

โดยใช้ Facade Pattern มาช่วย แล้วใช้ DTO รับส่งระหว่าง Layer 

 
อึมๆๆ แยกเป็น 3 เรื่องละกัน

1) Facade Pattern

2) DTO

3) Transaction   

 

จากที่ได้เห็น Jericho ถามก็พอจะรู้เลยว่าคุณ กำลังศึกษา

Patterns of Enterprise Application Architecture (PoEAA)

 

1) สำหรับ Facade Pattern (Design Pattern ของ GOF) ผมว่าที่พี่ Sand King ได้อธิบายไว้ใน REPLY #41 (106733)

เห็นภาพดีครับ

 "Facade Pattern คือ Class ที่เอางานย่อยๆ มายำรวมกัน"  + เพื่อให้ Client เรียกใช้ง่ายขึ้น

ไม่ต้องไปรู้รายละเอียดการเรียกใช้ให้ยุ่งยาก (Encapsulation )

 

แต่เนื่องจากที่คุณ Jericho กำลังศึกษาคือ PoEAA ดังนั้น Facade ตัวนี้ คงหมายถึง Remote Facade

นั่นคือ ประยุกต์ Facade Pattern ของ GOF เพื่อเอามาใช้ในกรณี ที่มีการเรียก ข้าม Network

เพื่อช่วยในเรื่อง ของ Performance  แบบที่คุณเข้าใจแหละครับ คือ ลดจำนวนครั้งในการเรียกให้น้อยลง

 

ซึ่งตรงนี้จริงๆ ผมมองว่าอาจจะเป็นอีก Layer นึง ที่มาครอบ Service Layer หรืออื่นๆ ก็ได้เพื่อ ช่วยในเรื่อง Remote Call ข้าม Network

เช่น  WebServiceFacade *-* ตั้งชื่อมั่วๆๆ  มันคงต้องมอง Client มีใครมาเรียกบ้างละมั้งครับ.. 
 
ส่วน Service Layer อาจจะมองในลักษณะของการช่วยให้ ทาง Client เรียกใช้
Layer อื่นๆ ได้ง่ายขึ้น + รวมถึงคุม Log,Transaction ต่างๆอะไรประมาณนี้มั้ง
พูดไปพูดมาเหมือนมันจะคล้ายกันแฮะ *-*
 

2) สำหรับ DTO (Data Transfer Object )

-->เป็น Class ที่ไม่ต้องมี Business Logic มีแต่ Property ,Field ซึ่งส่วนใหญ่ที่เราทำๆ กันก็จะเป็นแบบนี้

แล้วเอา Class Service  ที่มีแต่ Method (ที่มี Business Logic ) มาเรียกใช้ มันอีกที

 

อันนี้ คงแล้วแต่คนใช้มั้งครับ ตามใน PoEAA ก็จะใช้ร่วมกับ Remote Facade 

สำหรับบางคนก็แปลง Domain เป็น DTO เพื่อให้มา Map กับการ Design หน้า UI

เถียงกันไม่รู้จบ *-*
 

3) สำหรับ Transaction ผมก็ว่าน่าจะไว้ที่ SL นี่แหละครับ แต่ก็ยังไม่เก่งเรื่องการวาง

 Trasaction เอาซะเลย  ท่านพอจะแนะนำได้ใหมครับ 

ยิ่ง Pattern  UnitOfWork นี่ก็ยังงงๆๆ เลยถ้าเขียน มันต้องทำยังไง เศร้าใจกับชีวิตเจงๆๆ

 
สรุปก็คงประมาณนี้มั้งครับ ไว้ค่อยกลับมาลง รายละเอียดอีกที..
 
วันนี้ก็เลยยังไม่ได้พูดถึงเรื่อง Focus to Business Logic Layer
แต่ถ้าให้พูดถึงนี่ก็คงไม่รู้จะพูดยังไงดี คิดไม่ออก ^^
เอาเป็น Microsoft 3-Layer Style vs Domain-Driven Design Style มะ ^^
 
ปล.
- Reply นี้ pattern เพียบเลย *-* ถ้าสนใจ Pattern ลองดูบทความของคุณ aekram43 (www.dotnetdiff.net)
- เด๋วไว้ว่างๆๆ ต้องขอจิ๊กรูปที่ www.dotnetdiff.net  ซะหน่อย พี่เอกเค้าทำรูปได้ดีมากๆๆเลย 
 


tapeza555 วันที่ส่ง: 10 มิ.ย. 52 15:53 GMT+7
วันที่ปรับล่าสุด: 10 มิ.ย. 52 15:53 GMT+7
REPLY #68 (108298)
การออกแบบ TX ว่าจะใช้จุดไหนนั้น ส่วนใหญ่ ขึ้นอยู่กับหลายๆ ปัจจัย นะ
บางคนกล่าว ต้องเอาที่ถูกต้อง!!
แต่โลกจริง ต้องเอาให้มันทำงานได้!!
 
1. ถ้าจะเอาสวยงาม ก็เลือก Service Layer กางคลุมไปเลย ปัญหาอะไรค่อยว่ากัน
2. ถ้าจะเอา hi performance ก็เลือกใช้เฉพาะจุดครับ
   เพราะโอกาสของ deadlock และ data inconsistency อาจจะเกิดขึ้นได้ ในกรณีของ concurrent จำนวนมาก ๆ
 
 


Nine (นาย) วันที่ส่ง: 10 มิ.ย. 52 17:10 GMT+7
วันที่ปรับล่าสุด: 10 มิ.ย. 52 17:10 GMT+7
REPLY #69 (108299)
หลาย ๆ งานที่ต้องเรียกใช้งาน method กันวุ่นวาย  เจอมาแล้วในระบบใหญ่ ๆ
ซึ่งคุณต้องนั่งวิเคราะห์ด้วยว่า จุดไหนจะแยกระดับของ transaction level ยังไง งานใดใช้ level ไหน
 
ไม่ใช่คิดแต่ว่า จะใช้ Serialize ทั้งหมด  เพราะนี่คือจุดสำคัญ ของการทำงานในส่วน Transaction เลยครับ
 
 


Nine (นาย) วันที่ส่ง: 10 มิ.ย. 52 17:14 GMT+7
วันที่ปรับล่าสุด: 10 มิ.ย. 52 17:14 GMT+7
REPLY #70 (108979)

ขอบคุณพี่นายมากๆครับ ผมก็เห็นด้วยกับพี่นายเลยครับ การจะวาง Transaction นี่

มันต้องดู วิเคราะห์ด้วยว่า จุดไหนจะแยกระดับของ transaction level ยังไงดี 
เดี๋ยวจะมาเขียนต่อนะครับ
 
พอดี หลายๆวันที่หายไปยุ่งๆเลยไม่ได้เข้ามาอัพ (จริงๆขี้เกียจ *-* )ตอนนี้เริ่มว่าง
ก็เลยมาขุด ขึ้นมาซะหน่อย..  และก็คิดขึ้นมาว่าจะแยก Blog เป็นอีกกระทู้ที่จะเขียน
ทางด้าน ASP.NET,Javascript และอื่นๆ  ไปเลย เพราะหลายๆ ท่านสนใจพอสมควร
ซึ่งคงเขียนอะไรที่มันง่ายๆ ไม่ได้ยากอะไร เพราะไม่ค่อยมีใครเขียนกัน
เนื่องจากเห็นว่ามันไม่ยาก แต่สำหรับบางคนที่ไม่รู้ มันยากครับ *-*
 
ขอบคุณครับ
tapeza2009
2009-06-22


tapeza555 วันที่ส่ง: 22 มิ.ย. 52 09:28 GMT+7
วันที่ปรับล่าสุด: 22 มิ.ย. 52 09:28 GMT+7
REPLY #71 (108987)
อย่าคาดหวังกับ Web ผมมากครับ เขียนตาม อารมณ์ และ ทรงผม ครับ


aekram43 วันที่ส่ง: 22 มิ.ย. 52 10:57 GMT+7
วันที่ปรับล่าสุด: 22 มิ.ย. 52 10:57 GMT+7
กระทู้นี้มีอายุเกิน 365 วันแล้ว ท่านจะไม่สามารถตอบกระทู้นี้ได้อีก
ถ้าต้องการสนทนาต่อ กรุณาตั้งเป็นกระทู้ใหม่ได้ในหน้าโฮม
และอาจจะอ้างถึงกระทู้นี้ โดยก๊อปปี้ข้อความในกล่องสีขาวด้านล่างไปแปะในกระทู้ใหม่

copy เพื่ออ้างอิงถึงข้อความนี้:
Blog - tapeza555 : Dev All In One :)
http://greatfriends.biz?102635


8 ก.ย. 20:16
Online: 184