Thứ Hai, 5 tháng 11, 2012

C# – Tìm hiểu về Anonymous method

Anonymous method (tạm dịch là phương thức vô danh) là phương thức không có tên được khai báo với từ khóa delegate. Anonymous method cho phép bạn tạo ra các hành động cho một cho delegate với cách viết inline.

(Để nắm bắt được các vấn đề trình bày trong bài này, bạn cần có sẵn các kiến thức về delegate và generic method)

1. Giới thiệu

Giả sử bạn có một phương thức AddListItem() dùng để thêm một ListViewItem vào ListView. Bạn khai báo một delegete và tạo một thể hiện của nó để sử dụng:

delegate void AddListItemHandler(ListViewItem item);

private void AddListItem(ListViewItem item)

{

listView1.Items.Add(item);

}

AddListItemHandler addItemHandler = new AddListItemHandler(AddListItem);

Việc khai báo phương thức AddListItem nếu chỉ để sử dụng một lần cho delegate này thì có vẻ như không cần thiết. Thay vì viết như trên ta có thể sử dụng anonymous method để rút ngắn lại mã lệnh cần viết và hạn chế số lượng phương thức không cần thiết:

delegate void AddListItemHandler(ListViewItem item);

AddListItemHandler addItemHandler = delegate(ListViewItem item)

{

listView1.Items.Add(item);

};

Trong trường hợp viết mã lệnh xử lý cho các sự kiện của một đối tượng nào đó, bạn có thể sử dụng phương pháp này nếu như thấy thích hợp, chú ý các tham số phải khớp với delegate được khai báo:

button1.Click += delegate(object sender, EventArgs e)

{

MessageBox.Show("Bạn vừa click button1″);

};

2.     Sử dụng Predicate<T>, Action<T> và Comparison<T>

Đây là ba delegate được xây dựng sẵn và dùng khá nhiều trong C# 2. Chúng được khai báo như sau:

public delegate bool Predicate<T> (T obj)

public delegate void Action<T> (T obj)

public delegate int Comparison<T> (T x, T y)

Predicate<T> được sử dụng để kiểm tra các giá trị có thỏa mãn một điều kiện nào đó không, như bạn cũng có thể nó trả về kiểu bool.

Action<T> sử dụng để thực hiện các hành động với đối tượng mà bạn truyền vào, và không trả về giá trị nào cả.

Comparison<T> dùng để so sánh hai đối tượng cùng kiểu, thường sử dụng trong các trường hợp sắp xếp.

  • Predicate<T>

Để thấy được công dụng của nó, chúng ta thử đi  khảo sát lớp Array với các phương thức tĩnh của nó.  Bạn có thể thấy là lớp Array này cung cấp khá nhiều phương thức generic. Ta lấy ví dụ về phương thức thường được sử dụng là FindAll dùng để tìm tất cả các phần tử thỏa mãn điều kiện, nó được định nghĩa như sau:

T[] Array.FindAll<T>(T[] array, Predicate<T> match)

Một phương thức generic có thể làm việc với bất kì kiểu nào, điều này rõ ràng là cần thiết vì nó làm việc với bất kì mảng thuộc kiểu dữ liệu nào mà bạn truyền vào. Ở đây ta quan tâm tới tham số thứ hai Predicate<T> match là một delegate xác định điều kiện cho phần tử cần tìm kiếm. Ví dụ ta có một mảng int[]:

int[] array ={ 10, 4, 3, 2, 8, 6, 5, 7, 9, 1 };

Nhiệm vụ của ta là lấy ra tất cả phần tử chẵn trong mảng. Bằng cách sử dụng anonymous method ta có thể viết như sau:

int[] evens = Array.FindAll<int>(array, delegate(int n)

{

return n % 2 == 0;

});

Theo cách thông thường bạn không cần viết <int> vào sau tên phương thức, trình biên dịch sẽ tự động xác định kiểu của tham số.

int[] evens = Array.FindAll(array, delegate(int n)

{

return n % 2 == 0;

});

  • Action<T>

Bây giờ ta đã có một mảng evens chứa các số chẵn trong mảng array. Công việc tiếp theo là in chúng ra màn hình để xem kết quả. Bạn nghĩ tới việc dùng cấu trúc lặp foreach để làm việc này. Rất tốt nhưng vì đang bàn về chủ đề này nên ta sẽ tìm kiếm một cách thức khác tiện lợi hơn. Thật may mắn là nó nằm sẵn trong lớp Array với tên phương thức là ForEach (bạn cũng có thể tìm thấy phương thức này trong các kiểu collection khác).

Cú pháp của phương thức:

void Array.ForEach<T>(T[] array, Action<T> action)

Ở đây nếu bạn đã hiểu được các vấn đề được nói tới ở trên thì công việc lúc này trở nên rất đơn giản. Bạn có thể tự viết được mã lệnh để sử dụng phương thức ForEach này với anonymous method. Nếu chưa bạn cũng có thể xem cách làm tương tự như dưới đây:

Array.ForEach(evens, delegate(int n) { Console.WriteLine(n); });

Như bạn có thể thấy trong phần định nghĩa Predicate<T> và Action<T>, chúng yêu cầu duy nhất một tham số với kiểu bất kì. Ở trên vì đang làm việc với kiểu int nên ta sẽ truyền vào delegate kiểu int và tên biến tự đặt là n. Sau đó chỉ việc dùng tham số n này trong khối lệnh của anonymous method.

  • Comparison<T>

Một ngày đẹp trời bạn coi lại ví dụ này và thấy các phần tử của mảng sắp xếp quá lộn xộn, và bạn muốn sắp xếp lại chúng nhưng lại không muốn sử dụng các thuật toán sắp xếp. Bạn tìm và thấy phương thức Sort trong lớp Array và bắt đầu thực hiện, kết quả thật mĩ mãn. Bạn chú ý đến overload thứ 5 của phương thức Sort này, nó được định nghĩa:

void Array.Sort<T> (T[] array, Comparison<T> comparison)

Bạn thấy thích thú và muốn sử dụng nó, chú ý rằng nó yêu cầu hai tham số.

Array.Sort(evens, delegate(int x, int y)

{

return x.CompareTo(y);

});

Rất đơn giản nhưng bạn tự hỏi tại sao phải sử dụng cách này trong khi các overload khác của nó dễ sử dụng hơn nhiều? Đặt trường hợp bạn có một danh sách các đối tượng kiểu NhanVien có nhiều thuộc tính, và trong nhiều ngữ cảnh khác nhau, bạn cần sắp xếp danh sách này theo một thuộc tính riêng (chẳng hạn xếp theo tên, tuổi, lương,…) thì rõ ràng cách dùng Comparison<T> là linh hoạt và dễ dàng nhất.

3. Phần kết

Bạn đã làm quen và nắm được cơ bản cách sử dụng anonymous method, đây là một bước cần thiết để giúp bạn tiếp thu một kiến thức khác mà tôi sẽ giới thiệu trong các bài sau, đó là về Lambda Expression. Hy vọng bạn có thể áp dụng các kiến thức trong bài này trong việc giải quyết các vấn đề và phát triển ứng dụng của mình.

C# – Cơ bản Delegate (very basic)

Delegate là một kiến thức căn bản cần nắm vững khi bạn nhập môn C#, .NET. Mặc dù bạn có thể cho rằng delegate không cần thiết và tránh sử dụng nó (một cách trực tiếp) nhưng cuối cùng bạn vẫn phải nhận thấy rằng: mình không thể "sống" khi thiếu delegate. Delegate không khó hiểu cũng như không khó để áp dụng, nếu bạn dành một chút thời gian nghiên cứu.

Delegate là gì?

Trong tiếng Việt, delegate được dịch là "ủy nhiệm hàm", tuy nhiên mọi người đều không sử dụng từ này mà gọi bằng tên gốc là delegate. Thật tốt nếu bạn đã từng biết qua trong C/C++, đặc biệt về khái niệm con trỏ, bởi vì delegate tương tự như con trỏ hàm trong C++.

Một delegate giống như một "người đại diện" hay "đại sứ". Một delegate có thể được dùng để tạo một bao đóng (encapsulation) cho bất kì phương thức nào, miễn là nó phù hợp (kiểu trả về, tham số). Là một "đại sứ", delegate có thể triệu gọi phương thức bất kì nơi nào: từ đối tượng này đến đối tượng kia, từ thread này sang thread kia,… Đây là đặc điểm chính của delegate, bạn sẽ cần nhớ lại điều này khi giải quyết các vấn đề thường gặp như truyền dữ liệu giữa hai Form, xử lý lỗi "Cross-thread operation not valid", tạo event, …

Ngoài ra, bởi vì là một đối tượng, delegate có thể được truyền vào làm tham số của các phương thức. Bạn có thể hiểu đơn giản: delegate là một đối tượng dùng để bao đóng một hoặc nhiều phương thức (Multicast), hay có thể coi delegate là một sự kết hợp giữa đối tượng và phương thức.

Ta sẽ học cách sử dụng delegate qua 3 bước:

  •  Khai báo
  •  Khởi tạo
  • Thực thi

Khai báo

Là một đại diện của phương thức và là một kiểu dữ liệu, cách khai báo delegate giống như một sự kết hợp giữa khai báo đối tượng và phương thức. Một delegate được khai báo theo cú pháp sau:

[modifier] delegate return-type Identifier ([formal-parameters])

Trong đó:

  • modifier: phạm vi truy xuất (public, private, protected, internal)
  • delegate: từ khóa
  • return-type: kiểu dữ liệu trả về
  • Identifier: định danh của delegate
  • formal-parameters: danh sách các tham số hình thức

Các phần trong cặp ngoặc vuông [] là tùy chọn.

Ví dụ:

public delegate int DoSomething(int x, int y)

Khai báo một delegate có tên DoSomething, bạn có thể dùng delegate này đại diện cho bất kì phương thức nào yêu cầu hai tham số kiểu int và trả về kiểu int.

Khởi tạo

Giả sử  ta có một phương thức sau, có kiểu trả về và tham số tương ứng với delegate DoSomething trên:

int Add(int x,int y)
{
return x+y;
}

Khởi tạo delegate từ một phương thức có sẵn, bạn cần truyền phương thức mà delegate sẽ đại diện vào trong constructor. Bạn có thể khởi tạo delegate theo một trong hai cách sau. Chúng tương đương nhau khi được biên dịch:

// cách 1
DoSomething myDelegate = new DoSomething(Add)

// cách 2
DoSomething myDelegate = Add;

Hoặc sử dụng tên đầy đủ của phương thức:

DoSomething obj = MyNamespace1.Program.Add;

Thay vì tạo phương thức Add() trên, bạn có thể sử dụng anonymous method hoặc lambda expression để tạo đối tượng:

// anonymous method
DoSomething obj = delegate(int x,int y){
return x+y;
};

// lambda expression
DoSomething obj = (x,y) => x+y;

Thực thi

Có hai cách để bạn thực thi delegate.

Coi delegate như một phương thức:

myDelegate(a, b)

và như một đối tượng, bằng cách gọi phương thức Invoke():

myDelegate.Invoke(a, b)

Ví dụ

class Program {     public delegate int DoSomething(int x,int y);      public static void Main(string[] args)     {         Math m=new Math();         DoSomething obj = (x,y)=>x+y;          int value=obj(3,4);          Console.WriteLine(value); // output: 7         Console.ReadKey();     } } 

Tiếp theo là gì?

Sau khi hiểu được cơ bản delegate, bạn có thể cần tìm hiểu thêm về event. Trong .NET cũng có những delegate được tạo sẵn (build-in), bạn có thể tìm thấy các vấn đề này trong blog của tôi tại:

-          Anonymous Method

-          Lamdba Expression

-          Event

Một series hướng dẫn khá đầy đủ về delegate và event trên codeproject, bao gồm cả multicast delegate:

Thứ Tư, 31 tháng 10, 2012

Xu hướng mua hàng qua mạng

Cùng với sự phát triển của thương mại điện tử, việc mua hàng qua mạng không còn xa lạ với nhiều người trong thời buổi 'nhà nhà dùng mạng, người người online'.

Thông thường, khi có nhu cầu mua sắm, khách hàng đến các khu trung tâm thương mại, cửa hàng... Việc này tốn không ít thời gian và chi phí, người mua có thể tiếp cận thụ động với sản phẩm, hàng hóa không phong phú, ít sự lựa chọn.

Theo đó, nhiều người chọn mua đồ trên mạng, nhất là trong thời buổi Internet phát triển như hiện nay. Tuy nhiên, để tránh bị lừa, khách hàng nên chọn những "chợ" có uy tín trên mạng, cũng như tìm hiểu kỹ thông tin về sản phẩm, người bán, trước khi quyết định mua. Tận dụng thời gian, thời gian rảnh hoặc trong giờ nghỉ trưa, nhiều "dân" mạng online thỏa sức mua sắm, chỉ cần với một chiếc máy tính kết nối mạng.

Chỉ cần gõ tên sản phẩm cần mua vào những trang tìm kiếm như Google, Yahoo… hay các trang mạng xã hội như Facebook, Zing me..., bạn sẽ có vô số thông tin về sản phẩm, từ những nguồn cung cấp khác nhau. Với những ai thường xuyên mua hàng trên mạng có thể truy cập trực tiếp vào các website như  Vatgia, Enbac, 5giay, muachung,… Đó là những "siêu thị online", đem đến cho khách hàng nhiều sản phẩm và những lựa chọn khác nhau.

Chị Hương, ở Cầu Giấy, Hà Nội, người có thói quen săn các thẻ giảm giá trên mạng, cho biết những voucher ưu đãi hay sản phẩm thường được bán trên website mua sắm cộng đồng với giá khá rẻ, thậm chí mức giảm có khi lên đến 90%. Điều này giúp tiết kiệm được ngân sách chi tiêu của gia đình. Ngoài ra, sắm đồ trên mạng, chị còn được thỏa sức cân nhắc giá cả, mẫu mã mà không sợ bị chủ cửa hàng khó chịu, tiết kiệm thời gian đi lại khi mùa lạnh sắp về.

Thứ Ba, 2 tháng 10, 2012

www.*.Org .name .ac .info là gì ? giải thích ý nghĩa đuôi tên miền

Bạn đã từng đếm được xem mình đã xem bao nhiêu trang web chưa ?
Chắc là khó có thể thống kê được nhưng mình tin một điều không phải ai cũng biết được hết ý nghĩa các loại tên tên miền này.
Mình xin phép được chia sẻ ý nghĩa của một số đuôi tên miền phổ biến mà các bạn hay gặp.

1. Tên miền quốc tế có cấu trúc:
- Tên đăng ký, ví dụ như: google, yahoo, msn,...
- Tiếp theo là đuôi tên miền, ví dụ như: .com, .net, .edu, .org, .int, .gov, .info, .name ,...
Ví dụ tên miền quốc tế: google.com
2. Tên miền quốc gia:
Tên miền quốc gia sẽ được gắng thêm đuôi ký hiệu của các nước, ví dụ như: .vn (việt nam), .cn (Trung quốc), .uk (Anh Quốc),...
Ví dụ tên miền quốc gia: google.com.vn
Ý nghĩa một số đuôi tên miền
.COM: Dành cho tổ chức, cá nhân họat động thương mại.
.BIZ: Dành cho các tổ chức, cá nhân hoạt động kinh doanh, tương đương với COM.
.EDU: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực giáo dục, đào tạo.
.GOV: Dành cho các cơ quan, tổ chức nhà nước ở trung ương và địa phương.
.NET: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực thiết lập và cung cấp các dịch vụ trên mạng.
.ORG: Dành cho các tổ chức hoạt động trong lĩnh vực chính trị, văn hoá xã hội.
.INT: Dành cho các tổ chức quốc tế tại Việt Nam.
.AC: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực nghiên cứu.
.PRO: Dành cho các tổ chức, cá nhân hoạt động trong những lĩnh vực có tính chuyên ngành cao.
.INFO: Dành cho các tổ chức hoạt động trong lĩnh vực sản xuất phân phối, cung cấp thông tin.
.HEALTH: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực dược, y tế.
.NAME: Dành cho tên riêng của cá nhân tham gia hoạt động Internet

Lưu giữ Session của bạn với JQuery và ASP.NET

Khi bạn làm việc với Session trong ASP.NET điều đầu tiên bạn cần quan tâm đó là làm sao để Session không bị Timeout, mặc định thời gian timeout của 1 Session được cấu hình trong file Web.Config và có thời gian là 20 phút.

Ví dụ khi khách hàng đăng nhập vào hệ thống của bạn nếu Session timeout điều đó có nghĩa với khách hàng sẽ phải đăng nhập lại, điều này thường gây khó chịu cho một số người.

Để tránh điều này chúng ta sẽ sử dụng JQuery Ajax để cách 10s chúng ta sẽ lấy lại Session cho người dùng thông qua file Generic Handler (ASHX)

Đầu tiên bạn hãy tạo 1 file Generic Handler (ASHX) có tên là KeepSessionAlive.ashx

Code như sau:

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class KeepSessionAlive : IHttpHandler ,IRequiresSessionState
{
 
    public void ProcessRequest(HttpContext context)
    {
        //khoi tao lai Session
        context.Session["KeepSessionAlive"] = DateTime.Now;
    }
 
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Using thêm

code
1
using System.Web.SessionState;

trong class này bắt buộc chúng ta phải kế thừa thêm từ Interface IRequiresSessionState bởi nếu không khi biên dịch bạn sẽ gặp lỗi ở context.Session

Tiếp theo bạn vào file Default.aspx viết Javascript như sau:

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script language="javascript" type="text/javascript">
        $(function() {
            setInterval(KeepSessionAlive, 10000);
        });
  
        function KeepSessionAlive() {          
            $.post("/KeepSessionAlive.ashx", null, function() {
                $("#result").append("<p>Session is alive and kicking!<p/>");
            });  
        }  
    </script>
    <h2>Will my session die?</h2>  
    <div id="result"></div>

Khi trang web được load lên tôi sẽ setInterval cho hàm KeepSessionAlive() là 10s 1 lần có nghĩa cứ 10s tôi sẽ gọi lại hàm KeepSessionAlive().

Trong hàm KeepSessionAlive() tôi sẽ post lên file KeepSessionAlive.ashx để khởi tạo lại Session.

Theo DotnetCurry

Thứ Ba, 25 tháng 9, 2012

Sử dụng ELMAH và MiniProfiler với ASP.NET MVC 4

Nếu bạn mới tập làm quen với ASP.NET MVC, bạn có thể chưa biết về ELMAH và MiniProfiler. Đây là hai dự án mã nguồn mở mà bạn có thể cài đặt dễ dàng với NuGet, và cả hai đều nhằm giúp lập trình viên có thể gỡ rối và chuẩn đoán lỗi của ứng dụng. Bài viết này nhằm giới thiệu sơ lược về hai phần mềm này.

ELMAH

<ELMAH là thư viện giúp log (ghi lại) tất cả các lỗi đã xảy ra với ứng dụng. Bạn có thể log và xem tất cả các lỗi mà không cần phải thay đổi bất kỳ dòng code nào. Tất cả bạn cần phải là đó là gọi câu lệnh "install-package" ở ứng dụng Package Manager Console của Visual Studio và ELMAH sẽ được dự án tham chiếu và được cấu hình để hoạt động. Bạn chỉ cần điều hướng đến địa chỉ /elmah.axd trong ứng dụng của bạn, và bạn sẽ thấy tất cả các lỗi (tuy nhiên, bạn chỉ thấy danh sách lỗi nếu đó là các request cục bộ, vì elmah đã được cấu hình mặc định như vậy).

imagetitle


ELMAH giữ tất cả các lỗi trong bộ nhớ, do đó, nếu ứng dụng bị khởi động lại, tập tin log sẽ bị xóa. Nếu bạn mong muốn thông tin log vẫn được lưu lại, bạn có thể cấu hình ELMAH để lưu thông tin log vào một nơi có thời gian sống lâu hơn, ví dụ như trong một database. Bạn có thể cấu hình cho elmah để lưu log lỗi trong database của SQL Compact hoặc SQL Server, hay thậm chí với MongoDB, và hơn thế nữa.

ELMAH và HandleErrorAttribute

Với các dự án ASP.NET MVC, banh nên cài đặt gói elmah.mvc trên NuGet. Khi đó elmah.mvc sẽ tạo ElmahController cho dự nên bạn có thể truy xuất vào địa chỉ /elmah. Quan trọng hơn, elmah.mvc sẽ cài đặt một action filter để log các lỗi cho dù chúng bị đánh dấu là "handled" (đã được quản lý) bởi HandleErrorAttribute. Nếu bạn chỉ cài elmah, các lỗi này sẽ bị bỏ qua, nhưng với elmah.mvc thì tất cả sẽ được log lại.

MiniProfiler

<MiniProfiler là một công cụ giúp tìm các vấn đề về tốc độ thực thi và hiện tượng thắt cổ chai một cách đơn giản và dễ dàng. Để bắt đầu với MiniProfiler, bạn có thể cài đặt gói MiniProfiler.MVC3 trên NuGet (gói này cũng hoạt động được trên ASP.NET MVC 4). Sauk hi cài đặt xong, thêm một dòng mã lệnh ở các template _Layout ngay trước thẻ </body>:

@StackExchange.Profiling.MiniProfiler.RenderIncludes()  

Ngoài ra bạn cần một handler để giúp MiniProfiler có thể lấy về các tập tin script mà nó cần, bạn thêm cấu hình như sau vào tập tin web.config tại thư mục gốc của dự án:

<system.webServer>   ...   <handlers>     <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*"           type="System.Web.Routing.UrlRoutingModule"          resourceType="Unspecified"           preCondition="integratedMode" />   </handlers> </system.webServer> 

Một khi mọi thứ đã sẵn sàng, bạn sẽ thấy kết quả mà MiniProfiler sẽ cung cấp trên góc trên trái của cửa sổ trình duyệt (theo cấu hình mặc định thì thông tin này chỉ xuất hiện ở các request cục bộ). Bạn click vào "time measurement" để xem chi tiết:

imagetitle

Dựa vào MiniProfiler, bạn có thể biết là action mất bao nhiêu thời gian để được thực thi và views mất bao nhiêu thời gian để được tạo ra từ view template, và MiniProfile cũng cung cấp API để nếu bạn cần thông số của một số mã lệnh cụ thế nào đó. Khi MiniProfiler được cài, nó cũng sẽ thêm vào tập tin MiniProfiler.cs trong thư mục App_Start. Tập tin này chứa phần lớn các cấu hình của MiniProfiler, và do đó bạn sẽ dễ dàng cấu hình tùy thuộc vào trạng thái đăng nhập, và lưu thông thin profiling vào database nếu muốn.

Đây là hai dự án đáng để cho bạn quan tâm và sử dụng nếu bạn là lập trình viên ASP.NET.

Tìm hiểu về Cache trong ASP.Net


asp.net caching

Caching là một kĩ thuật phổ biến dùng để tăng sự thực thi bằng cách thường xuyên lưu lại các dữ liệu đã được truy cập hoặc dữ liệu lớn trong bộ nhớ. Trong khuôn khổ các ứng dụng Web thì caching dùng để giữ lại các trang hoặc dữ liệu qua những yêu cầu của HTTP và sử dụng lại chúng mà không cần phải tạo lại lần nữa. ASP.Net có Một số các kiểu caching có thể sử dụng cho các ứng dụng web gồm : output caching, fragment caching, data caching.

 

Outpug caching: Khi dùng Output caching  toàn bộ nội dung của trang sẽ được lưu lại. Với những trang có lượng truy cập lớn, Caching sẽ thường xuyên lưu lại (đến )từng phút một. Khi một trang được lưu lại bằng Output cache, Những yêu cầu gửi tới trang đó sẽ được thực hiện ở trang output mà không cần phải thi hành code hay tạo lại nữa.

 

 Fragment caching: Đôi khi lưu lại toàn bộ trang là không cần thiết, có thể chỉ một phần của trang phải được tạo ra hoặc đáp ứng một yêu cầu nào đó của người sử dụng. Khi đó, Bạn cần  phải xác định những đối tượng và dữ liệu nào cần thiết để tạo dựng và đáng để lưu lại. Mỗi khi nhận ra các phần tử đó thì chúng có thể được tạo ra một lần và sẽ được lưu lại trong một khoảng thời gian nào đó. Ngoài ra, Fragment caching còn có thể được sử dụng để lưu lại một phần của trang output.

 

Data caching:    Bạn làm thế nào để lựa chọn thời điểm lưu lại một phần từ trên trang? Với một vài phần tử, dữ liệu có thể bị thay đổi một cách đều đặn hoặc dữ liệu chỉ có giá trị tại một thời điểm hiện tại. Khi đó một "chính sách" với các phần tử được lưu sẽ được đưa ra trước khi chúng mất đi. Code để truy cập tới các phần tử được lưu chỉ đơn giản là kiểm tra xem nó có hay chưa và tạo lại nó nếu cần thiết.

 

Cache của ASP.net cung cấp các tệp và từ khóa tạo sự phụ thuộc, cho phép bạn tạo phần tử cache phụ thuộc vào một file bên ngoài hoặc phụ thuộc vào một phần tử cache khác. Kĩ thuật này có thể được sử dụng để xóa  bỏ các phần tử  nằm trong những dữ liệu thay đổi.

 

Ở phần 1 của bài viết tôi sẽ giới thiệu với các bạn về Output cache và Fragment cache.

 

Output cache

 

 Chúng ta sử dụng output caching cho toàn bộ trang mà không thay đổi thường xuyên.  Output caching sẽ lưu lại  toàn bộ  dữ liệu HTML của trang web. Mỗi lần có một request đến, nó sẽ kiểm tra xem đã có trong cache hay chưa nếu có thì nó sẽ được trả về còn chưa thì nó sẽ được lưu lại trong Output caching. Để sử dụng trước tiên bạn hãy nhớ đặt chỉ thị  @OutputCache ngay đầu trang .aspx.

 

<%@ OutputCache Duration="600″ VaryByParam="None" %>

 

Các tham số:

 

Duration:  chỉ ra khoảng thời gian mà Cache sẽ lưu trữ trang đó, tính bằng giây. Khi hết khoảng thời gian này, cache sẽ hết hiệu quả, và trang sẽ được vẽ lại từ đầu.Trong khai báo trên thì trang sẽ được cache lại sau 10 phút. Tất cả nội dung đều được lưu lại kể cả hàm thời gian <%= now() %>

 

VaryByParam: chỉ ra tham số GET -thông qua QueryString ,tham số POST – thông qua các form nào sẽ được sử dụng để xác định cache được trả về. Nói cách khác, sẽ có nhiều phiên bản của trang web được lưu trữ, và hệ thống trả về phiên bản nào tùy theo giá trị tham số này. Bạn có thể nhận được kết quả cache khác nhau khi thay đổi giá trị của tham số đầu vào.

 

ví dụ :

 /Student.aspx?StudentID=1 sẽ trả ra thông tin sản phẩm StudentID =1. Nếu một request khác dạng /Student.aspx?StudentID=2, thì tất nhiên, sẽ phải trả ra thông tin sản phẩm với StudentID=2. Nếu bạn thiết lập tham số VaryByParam="none", thì engine cache sẽ giả thiết rằng tất cả các trang Student.aspx có kết quả trả ra như nhau, và hai trang trên trả về cũng một kết quả. Để giải quyết vấn đề, chỉ đơn giản chúng ta thiết lập tham số VaryByParam="StudentID", hoặc chỉ ra là cần xét tất cả các tham số: VaryByParam="*".

 

Ngoài ra bạn chỉ dẫn @OutputCache còn có thêm 2 thuộc tính nữa là VaryByHeader và VaryByCustom.

 

VaryByHeader:  thuộc tính này giúp bạn thay đổi cache theo  HTTP headers hiện tại. Nó thực sữ hữu ích khi bạn muốn cache những trang thay đổi về ngôn ngữ và các tác nhân của người dùng.

 

VaryByCustom.:  có thể quyết định output cache phụ thuộc vào các thiết lập khác nhau như là phiên bản của các trình duyệt.

 

Nếu bạn muốn dùng full page caching nhưng có một số chức năng trên đó bạn không sử dụng được, bạn có thể sử dụng lớp HttpCachePolicy. Bạn chỉ việc làm theo mẫu sau:

 

Response.Cache.[option] : trong đó option là các miêu tả bạn muốn.

 

Ví dụ: Response.Cache.SetExpires( DateTime.Now.AddSeconds( 600 ) )

 

Khi đó cứ sau 10 phút (600s): trang đó sẽ được cache lại một lần giống như ví dụ tôi đã trình bày ở trên.

 

Bạn cũng có thể sử dụng thuộc tính "cacheability" để xác định cách thức lưu trang. Bạn có các lựa chọn sau: 

 

NoCache: Toàn bộ trang hoặc một vài phần của  trang sẽ không được cache mà  phải có yêu cầu.

 

Server: Trang được cache ở Web Server

 

Public: Trang được cached ở máy client và được public, như là một proxy server          

 

Private: Trang chỉ được cache ở trên máy client. Thuộc tính này là mặc định

 

Fragment Caching

 

Có những lúc chúng ta không cache toàn bộ trang, mà chỉ là một phần của trang thôi. Chẳng hạn, danh sách đơn hàng trong công ty là biến đổi theo thời gian, nhưng danh mục hàng có thể là không đổi. Lúc này, chúng ta chỉ cache một phần của trang. Rất đơn giản, bạn cần phải sử dụng phương pháp cache một phần, hay cache một user control. Đó là fragments caching, xây dựng các user control mới (*.ascx), thiết lập thuộc tính Cache giống như là cách làm đối với một trang bình thường.

 

Một điều lưu ý đó là fragment caching không có các thuộc tính VaryByHeader hoặc VaryByCustom. Nó có các thuộc tính VaryByParam làm việc giống như output caching, ngoài ra chúng ta cũng sử dụng các thuộc tính khác như là VaryByControl. Thuộc tính này cho phép ta thay đổi nhiều thành phần cache cơ bản là giá trị của các server controls chứa trong đó, như là select box hay check boxes.

 

Đây chỉ là những mẫu cơ bản nhất của caching được cung cấp trong ASP. Net. Nó không hoàn toàn phù hợp trong tất cả các trường hợp nhưng khi sử dụng nó bạn sẽ nhận được rất nhiều lợi ích trong việc thực thi một ứng dụng Web.


Phần 2: Data Caching

 

Ở phần trước tôi đã giới thiệu với bạn 2 loại cache trong ASP.Net là Output caching và Fragment caching. Cả 2 phương pháp này đều giúp bạn tăng tốc độ xử lý trên ứng dụng web của mình. Tôi cũng đã trình bày những trường hợp phù hợp nhất để sử dụng 2 loại cache này. Tuy nhiên ASP còn cung cấp một kiểu cache khác rất hữu dụng mà bạn nên sử dụng trong nhiều trường hợp đó là Data cahing. Một cách đơn giản nhất, bạn có thể hiểu data cahing là một kĩ thuật được cung cấp để lưu trữ và truy cập các phần tử trong bộ nhớ. Điều đó có nghĩa là mỗi một đối tượng độc lập (Hầu hết các đối tượng của .NET) sẽ được cache và chia sẻ trong tất cả các Request và Session. Bài này tôi xin giới thiệu với bạn 3 phương thức được dùng trong data caching.


Phương thức Cache:

 

Đây là cách đơn giản nhất để bạn có thể lấy được một đối tượng hay dữ liệu vào cache. Nếu bạn đã quen thuộc với ASP, bạn sẽ thấy điều này rất đơn giản cũng giống như khi bạn sử dụng biến session.

 

Đây là cách bạn lưu dữ liệu vào cache:

 

strVal = "something trivial";

cache("item") = strVal;

 

Trong đó:

item       là tên biến.

strVal    là một giá trị biến bạn sẽ lưu nó vào cache.

 

Để trả lại giá trị cho biến hay lấy lại dữ liệu:

 

newVariable = cache("item");

 

Rất đơn giản để lưu và lấy lại dữ liệu từ cache nhưng bạn hãy luôn nhớ rằng data cache không chỉ làm việc được với các dữ liệu đơn giản kiểu chuỗi như ví dụ trên mà nó có thể làm việc với tất cả các loại dữ liệu ví dụ như kiểu mảng cũng có thể được lưu lại bằng cách này.


Phương thức .Insert & .Add

 

Vì Cache là một collection, nên chúng ta cũng có thể sử dụng hai phương thức là Insert và Add để thêm vào Cache. Cú pháp như sau:

 

strVal = "this is SOOO exciting!" ;

cache.insert("item", strVal);


hoặc


cache.add("item", strVal) ;

 

Cú pháp của 2 phương thức này hoàn toàn giống nhau. Có một điều khác đó là hàm add có thêm một lựa chọn, có thể trả về một đối tượng đã có trong dữ liệu cache. Bạn có thể chọn một trong 2  phương thức này tùy thuộc vào yêu cầu của bạn.

 

Hãy xem lại bạn đã học được những gì từ bài viết này. Đầu tiên bạn được đưa ra 3 loại cache để lựa chọn ( output cache, fragment cache và data cache). Tiếp đến, khi bạn sử dụng data cache bạn được cung cấp thêm những hàm để thi hành. Bạn được chọn lựa giữa hàm insert và hàm add. Cuối cùng tôi sẽ hướng dẫn các bạn làm sao để quy định thời gian kết thúc.

 

Đầu tiên là một ví dụ để thiết lập một thời gian kết thúc. Bạn có thể làm như sau:

 

strVal = "I'm learning so much!"

cache.insert("item", strVal, nothing, datetime.now.addminutes(10), timespan.zero) 'there should be no carriage return here

 

datetime.now.addminutes(10): đối tượng sẽ "chết" sau 10 phút.

 

Timespan:    dùng để thay đổi thời gian kết thúc.

 

Chúng ta hãy xét ví dụ tiếp theo. ví dụ này xét thời gian hủy đối tượng  đến thời điểm sau request cuối cùng của object đó.

 

strVal = "Caching is so much fun!"

cache.insert("item", strVal, nothing, datetime.maxvalue,

timespan.fromseconds(60))

 

Thuộc tính datetime.maxvalue vô hiệu hóa sự kết thúc đối tượng.

 

Có một lựa chọn rất thú vị. Chúng ta có thể làm cho ứng dụng bỏ đi một đối tượng trong cache, phụ thuộc vào sự thay đổi của các đối tượng khác. Khi một đối tượng mà nó phụ thuộc bị xoad đi thì nó cũng không còn được lưu trong cache nữa. Nó có thể là một file, một hoặc là nhiều  đối tượng nào đó được lưu.

 

Hãy đọc ví dụ sau:

 

strVal = "I may or may not have understood these directions…"

cache.insert("item", strVal, New CacheDependency(Server.MapPath("depend.xml")))

 

Cache cũng có những nhược điểm đó là nó làm tốn bộ nhớ. Khi bạn lưu trữ lại quá nhiều cũng dẫn tới những bất cập trong việc quản lý dữ liệu. Micosoft đã tính đến trường hợp này và cung câp cho chúng ta những thuộc tính để thiết lập sự ưu tiên.

 

Các thuộc tính:

    * Not Removable- không bao giờ thu dọn dẹp ở bộ nhớ thấp.

    * High- dọn dẹp nhứng phần tử cuối cùng

    * Normal- mặc định

    * BelowNormal – more likely purged

    * Low – first purged

 

Trước khi đưa ra ví dụ, tôi muốn bạn biết rằng chúng ta có 2 lựa chọn bạn phải có khi thiết lập các thuộc tính của cachel. Đầu tiên là CacheItemPriorityDecay sẽ thiết lập các thuộc tính cho các đối tượng mà được truy cập không thường xuyên. Thứ 2 là CacheItemRemoveCallback  sẽ được thiết lập khi ứng dụng muốn dọn dẹp các phần tử cache. Các thuộc tính là: DependencyChanged, Expired, Removed, or Underused.

 

strVal = "Finally, we're done!"

cache.insert("item", strVal, nothing, datetime.maxvalue, _

 timespan.fromseconds(60), CacheItemPriority.BelowNormal, _

 CacheItemPriorityDecay.Fast, OnRemove)

Pros and Cons of Data Caching

 

Như vậy với những trang quá động (dữ liệu được thay đổi nhiều theo thời gian), Data caching đã cung cấp những cải tiến mềm dẻo và thực thi  cho bạn. Nếu ứng dụng của bạn có một lượng truy cập lớn trên nhiều trang web, bạn có thể lưu nó vào cache sau đó phân phát đến từng trang một đó là ưu điểm lớn nhất. Bạn có thể load chúng vào cache lần đầu tiên được requested và sau đó sẽ phân bổ nó đi từ bộ nhớ. Điều này rất tuyệt cho tập hợp các dữ liệu được lấy từ cơ sở dữ liệu ví dụ như là  một employee list  hay là từ một site có cấu trúc điều hướng mà bạn không muốn cứ phải truy cập đến database ở từng trang một.

Liên kết quảng cáo :