PDA

View Full Version : [DIS] To Hell with Code Behide the Page in ASP.Net!



buitrungtin
24-04-2003, 11:51
sorry các bạn, cái title cua bài này không đúng với nội dung bài này đâu, tui chỉ muốn câu khách nên để cái title bắt mắt vậy thôi.

Vấn đề chính bắt đầu từ đây:

trong ASP.Net, ta có thể để code của trang web sang một file thường là cùng tên nhưng khác phần extension (gọi là code behide the page), phần code trong trang web có thể sử dụng code trong code behide the page. Nhưng nếu ta muốn viết một cái public procedure để có thể gọi được từ bất kỳ trang web nào trong web application thì làm sao?

thằng bạn tôi có một giải pháp là viết một cái class để wrap cái procedure đó lại, sau này ai muốn gọi procedure đó thì cứ tạo một object của class đó rồi dùng. Nhưng tôi thấy cái này hơi không ổn, vì một trong những tính chất của OO là encapsulate, mà cái class này đâu có member variable gì đâu mà en với chả cap. Vì vậy sử dụng một class để wrap cái procedure này là không hợp lý.

Tuy tui cũng khá quen thuộc với programming concept nhưng không có kinh nghiệm lập trình trong ASP.Net mà cũng chỉ mới làm quen với .Net có vài tuần thôi. Ngặt vì đang cần giải quyết gấp vấn đề này nên không có thời gian đọc sách, Xin các bạn cùng chỉ dẫn.
đa tạ, đa tạ.

danceswithwolves
24-04-2003, 12:05
dùng class bao gồm các static member. Chẳng cần create object vẫn gọi static methods được. BCL chẳng phải có rất nhiều static class kiểu này đó sao ?

buitrungtin
24-04-2003, 20:50
cám ơn bạn danceswithwolves rất nhiều vì đã trả lời câu hỏi của tui rất sớm.
Cái vụ dùng static methods này tui cũng không quen (học chưa tới), nhưng cũng tạm gọi là giải pháp hay nhất mà tui biết được cho vấn đề này.
Tuy nhiên, tui vẫn chưa hài lòng lắm vì vẫn là tạo một class. mà trước như tui đã nói, tạo một class mà không có cái member variable nào để wrap hết thì không được hợp lý.
Vả lại, dùng cái static methods này cũng đâu khác gì tạo một cái public method đâu, tại sao lại không tạo một cái public method cho khoẻ, mà còn hợp lý nữa? (tui không biết cách tạo một cái public method trong ASP.Net để có thể dùng từ bất cứ pages nào, ai biết xin chi dùm).
Sau cùng, như đã nói, tui không rành lắm cái vụ ASP.Net, nên nếu suy nghĩ của tui có gì không hợp lý, xin các bạn thông cảm và chỉ điểm, hoặc có cái link tới article nào hữu ích cho vấn đề này thì đa tạ, đa tạ.
cheers,
Tin

White_Rose
24-04-2003, 22:57
Nhưng nếu ta muốn viết một cái public procedure để có thể gọi được từ bất kỳ trang web nào trong web application thì làm sao?

thằng bạn tôi có một giải pháp là viết một cái class để wrap cái procedure đó lại, sau này ai muốn gọi procedure đó thì cứ tạo một object của class đó rồi dùng
Thật tình thì... chẳng hiểu gì cả :P Tại sao lại phải đi đường vòng vèo như thế???
Chỉ cần tạo hẳn một cái namespace riêng (chẳng hạn tên là MyNamespace)

namespace MyNamespace
{
class cls1
{
.....
}
}
rồi đầu mỗi trang thêm vào

<%@Import Namespace="MyNamespace"%>

With code behind:
using MyNamespace;
or
Imports MyNamespace
Sau đấy, trong MyNamespace khai báo các class theo ý thích. Khi nào cần sử dụng cái gì thì instantiate object ra sử dụng. Nếu không muốn tạo object thì sử dụng các static method -> thích gọi đâu thì gọi.

Hi, theo WR thì static cũng có cái lợi của nó trong nhiều trường hợp (nếu không thì MS đã không đưa ra rất nhiều static method trong các class của FCL)

danceswithwolves
25-04-2003, 11:38
Bài viết được gửi bởi buitrungtin
cám ơn bạn danceswithwolves rất nhiều vì đã trả lời câu hỏi của tui rất sớm.
Cái vụ dùng static methods này tui cũng không quen (học chưa tới), nhưng cũng tạm gọi là giải pháp hay nhất mà tui biết được cho vấn đề này.
Tuy nhiên, tui vẫn chưa hài lòng lắm vì vẫn là tạo một class. mà trước như tui đã nói, tạo một class mà không có cái member variable nào để wrap hết thì không được hợp lý.
Vả lại, dùng cái static methods này cũng đâu khác gì tạo một cái public method đâu, tại sao lại không tạo một cái public method cho khoẻ, mà còn hợp lý nữa? (tui không biết cách tạo một cái public method trong ASP.Net để có thể dùng từ bất cứ pages nào, ai biết xin chi dùm).
Sau cùng, như đã nói, tui không rành lắm cái vụ ASP.Net, nên nếu suy nghĩ của tui có gì không hợp lý, xin các bạn thông cảm và chỉ điểm, hoặc có cái link tới article nào hữu ích cho vấn đề này thì đa tạ, đa tạ.
cheers,
Tin

static methods khác methods thường chứ. Ví dụ :



class MyProc
{
static public DoSomething()
{
// some stuff...
}
}


class MyApp
{
static public void Main()
{
MyProc.DoSomething(); // không cần tạo object kiểu MyProc
}
}


hoàn toàn có thể tạo một DLL chứa các static public methods, khi sử dụng thì reference tới DLL rồi using là okie. Y như global functions thôi mà, phải không ?

buitrungtin
25-04-2003, 12:00
đa tạ White Rose đã chỉ dẫn.
Nhưng túm lại một câu: tôi muốn viết trực tiếp một method thôi để dùng chung cho cả application là không thể, mà phải wrap cái method đó vô một class?

puppy
25-04-2003, 13:49
Vì đó là OOP. OOP chỉ có object ngoài ra không còn gì khác.

bpmtri
25-04-2003, 13:56
Đúng là như vậy? Vì nếu bạn viết bằng C# thì không có khái niệm gì về "global methods" or "global functions". Chỉ có thể Wrap nó vào một class VD như Utilities chẳng hạn.

Về vấn đề OOP hay không OOP thì bạn nên nghĩ thoáng một chút, không phải bắt buộc phải wrap một member variable thì mới là một class. Bạn đọc kỹ lại khái niệm Encapsulation trong OOP xem.

buitrungtin
26-04-2003, 09:08
Khái niệm Encapsulate thì để tôi coi lại.
có điều, cái chuyện mà tui đang muốn hỏi, rõ ràng hơn là như vầy:
Mỗi cái web application là một class nằm trên server, mỗi khi bạn cahỵ một cái web application trên server thì web server sẽ tạo ra một object của Web application đó. Trong mỗi web application thì có nhiều page hợp lại, mà mỗi khi bạn request page nào thì một instance của page đó được tạo ra để tiếp tục process request (tôi không rõ lắm, nhưng tui tin là như vậy).
Cái Public method của tui muốn viết đây là một cái member method của cái web application. Nhưng tui không biết cách viết (khai báo, để ở đâu?), Nếu như những gì tui assume là đúng thì viết một cái Class để wrap cái method này thì đúng 100% là không ổn.
Như vậy nếu có bạn nào biết cách viết (hoặc biết là impossible để viết) cái public method như trên, xin chỉ giáo.
đa tạ,

White_Rose
27-04-2003, 00:35
Theo mình thì không. Mỗi lần bạn browse một page thì ASP.NET tiến hành compile (hoặc lấy ra compiled file trong cache) để tạo ra một instance của page cùng với một số object khác (như Response, Request...). Công việc này có thể liên quan đến nhiều file khác nhau (như các web user control .ascx chẳng hạn). Nhưng với mọi file không liên quan khác thì ASP.NET không hề biết đến --> web app không phải là một class. Các page mới là các class và chúng độc lập với nhau.
Nếu bạn sử dụng code-behide thì bạn nên xem lại toàn bộ file *.cs (hay *.vb hay ... tuỳ vào ngôn ngữ). Bạn sẽ thấy cấu trúc của nó là như sau:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace YourNamespace
{
public class WebForm1:System.Web.UI.Page
// đơn giản chỉ cần WebForm1:Page
{
.....
}
}
Phần màu đỏ là optional.
Và ở trang aspx thì sẽ có dòng directive sau:
<%@ Page Inherits="WebForm1" %>
=> dễ thấy page mới là class.
Theo minh, nếu làm như bạn nói thì cách tốt nhất có lẽ là tạo các function trong namespace riêng và khai báo chúng là static.

puppy
28-04-2003, 10:27
Bài viết được gửi bởi buitrungtin
đa tạ White Rose đã chỉ dẫn.
Nhưng túm lại một câu: tôi muốn viết trực tiếp một method thôi để dùng chung cho cả application là không thể, mà phải wrap cái method đó vô một class?

Đúng vậy bạn phải wrap cái function đó vô một class, ngoài ra không có cách nào khác. Vì nếu làm như bạn thì sẽ vi phạm nguyên tắc lập trình OOP. Trong lập trình OOP thuần tuý chỉ có object thôi. Một object muốn làm cái gì đó một là tự mình làm hoặc nếu có object nào làm giùm thì nhờ object đó làm, và nếu nhờ object khác làm thì không quan tâm đến object đó làm thế nào chỉ biết đưa vào input và nhận kết quả output là được rồi.

Còn việc Encapsulation của một object đâu nhất thiết object đó phải có đủ property và method chỉ cần có một cái là được rồi.

buitrungtin
19-05-2003, 12:28
hi White Rose,
mình vô tình đã tìm được cách giải quyết mà mình thoả mãn.
chỉ cần tạo một namespace và một module trong namespace đó, đặt vô trong global.aspx.vb rồi viết function trong module đó, page nào muốn dùng thì cứ việc import namespace là được.
again, tui không nói page không phải là class, tui nói application với lại page đều là classes.

manhdmit
06-11-2007, 17:57
Tôi đang cần kết nối csdl bằng môt class riêng, hoặc dạng code behind. ai có cao kiến xin chỉ giáo, tui xin đa tạ.