Thursday, October 20, 2011

LINQ to Entities: PredicateBuilder and Dynamic Linq

When you want to build dynamic filter for a query on LINQ to SQL or LINQ to Entities (Entity Framework, NHibernate, ..), you can use a famous Albahari's PredicateBuilder. But sometime, it may be doesn't work perfect with LINQ to Entities. To solve this problem, Pete Montgomery introduced a universal PredicateBuilder that combined the original version of Albahari's PredicateBuilder and LINQ to Entities: Combining Predicates.

Thursday, August 11, 2011

Apache: Deny access from everyone, except your IP address

To block all visitors to access your website except your IP address and customers’. You can add  following codes at the end of httpd.conf file and restart your httpd.

# Deny access from everyone, except those IP listed here:
<Files *>
  Order deny,allow
  Deny from all
  Allow from xxx.xxx.xxx.xxx
  Allow from yyy.yyy.yyy.yyy
</Files>

Wednesday, July 20, 2011

SQL: Lấy dữ liệu dòng cuối cùng trong mỗi group

Bài toán này đặt ra trong trường hợp khi bảng dữ liệu có từ hai khóa chính (primary key) trở lên, trong đó yêu cầu xác định dữ liệu sao cho một khóa chính nào đó là duy nhất và lớn nhất.

Wednesday, April 6, 2011

Sử dụng Impersonation để truy cập tài nguyên trong mạng

Với các ứng dụng cần thực hiện truy cập và sử dụng đến các tài nguyên có trong hệ thống  mạng nội bộ hoặc VPN (ví dụ như đọc/ghi file vào thư mục sharing trên serrver). Nếu ứng dụng của bạn chạy trong cùng một Domain và sử dụng Windows Authentication thì việc thiết lập này khá đơn giản.

Friday, March 18, 2011

Unit Testing: Giới thiệu về Moq

Moq cũng giống như RhynoMock hay TypeMock, là một thư viện .NET framework cho việc tạo các mock object. Nó hầu như sử dụng C# Lambda expression để tạo các kỳ vọng và kết quả trả về. Tuy nhiên, nó cũng bị chỉ trích vì hầu như không có sự phân biệt nào giữa Mock và Stub.
Moq cho phép bạn dể dàng thay đổi behaviour (hành vi) từ “Bắt buộc” sang “Tùy chọn” (Trong đó tùy chọn là ngầm định). Hành vi bắt buộc không cho phép bất kỳ triệu gọi nào đến mock object trừ khi trước đó đã được khai báo kỳ vọng tương ứng. Hành vi tùy chọn sẽ trả lại giá trị ngầm định nếu không được khai báo kỳ vọng. Ngoài ra bạn có thể thực hiện cấu hình hành vi theo ý đồ của bạn khi sử dụng.

Unit Testing: Mock không phải là Stub

Thuật ngữ 'Mock Object (Đối tượng giả định)' đã trở nên phổ biến, nó mô tả về các đối tượng trong trường hợp đặc biệt bắt chước các đối tượng thật trong kiểm thử. Hầu hết các ngôn ngữ lập trình bây giờ đều có framework giúp đơn giản hóa việc tạo các mock object. Mock object thường không thực tế, tuy nhiên là hình mẫu của đối tượng kiểm thử trong trường hợp đặc biệt và cho phép một cách khác của việc kiểm thử. Trong bài viết này, tôi sẽ giải thích các mock object làm việc như thế nào, bằng cách nào chúng giúp cho việc kiểm thử dựa trên xác nhận tình trạng thạng thái, và bằng cách nào sử dụng chúng để phát triển một cách khác của việc kiểm thử.

Tuesday, March 15, 2011

Suy ngẫm từ lời nói của người Nhật

Hôm nay, mình nhận được mail từ một khách hàng người Nhật, đất nước mà vừa trải qua một trận động đất 9 độ Richter và sống thần vào chiều ngày 11/3. Trong mail này, có đoạn họ viết về suy nghĩ của bản thân thật sự làm mình rất cảm động và cảm phục về ý chí và nghị lực của người Nhật. Và trông người lại ngẫm đến ta...

Japanese:

まだまだ混乱は続きそうですが、

我々のように、直接の被害を受けなかった者が、

可能な限り早く日常を取り戻すことが

何より復興につながると思っています。

Vietnamese:

Có vẻ như tình trạng hỗn loạn này vẫn còn tiếp tục kéo dài.

Nhưng những người không phải trực tiệp gánh chịu thiệt hại như chúng tôi sẽ cố gắng hết sức trong khả năng để có thể nhanh chóng trở lại nhịp sống ngày thường.

Hơn bao giờ hết,tôi nghĩ điều đó sẽ giúp cho đất nươc chúng tôi nhanh chóng phục hồi.

Monday, March 14, 2011

Dynamic trong C# 4 - Phần 3

Trong phần này tôi sẽ tiếp tục nói đến việc tận dụng khả năng của DLR trong việc mở rộng khả năng của một lớp sẳn có.

Mở rộng lớp đang tồn tại bằng DynamicObject

Với việc sử dụng lớp DynamicObject, bạn có thể cung cấp cú pháp tốt hơn cho mã nguồn của bạn hoặc mở rộng khả năng của các thư viện đang tồn tại. Bạn có thể tận dụng các phương thức sẳn có của một class cùng với khả năng thêm các thuộc tính và phương thức một cách tự động tại thời điểm runtime mà không phải viết toàn bộ code này một cách rõ ràng.

Dưới đây là một ví dụ tận dụng khả năng của DynamicObject kết hợp với ADO.NET trong việc lấy dữ liệu bằng câu lệnh SELECT và lưu từng cột giá trị nhận được của mỗi dòng dữ liệu trong các đối tượng IDataRecord.

Để chạy được ví dụ dưới đây, bạn cần sử dụng AdventureWorks2008 Database sample có thể download từ địa chỉ: Microsoft SQL Server Product Samples: Database.
Thông thường, nếu bạn dùng ADO.NET để truy vấn và hiển thị dữ liệu như ví dụ sau đây:

private static void ReadOrderData(string connectionString)
{
    string queryString = "SELECT [SalesOrderID], [CustomerID] FROM [Sales].[SalesOrderHeader];";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        try
        {
            while (reader.Read())
            {
                Console.WriteLine(String.Format("{0}, {1}",
                    reader[0], reader[1]));
            }
        }
        finally
        {
            // Always call Close when done reading.
            reader.Close();
        }
    }
}
Trong ví dụ này, bạn thấy rằng để truy cập vào từng cột giá trị trong từng dòng đọc được, ta sẽ phải dùng reader[0] (hoặc reader["SaleOrderID"]. Với việc mở rộng IDataRecord bằng DynamicObject, bạn có thể sử dụng reader.SaleOrderID, trong ví dụ dưới đây định nghĩa một lớp có tên DataRecordDynamic:
public class DataRecordDynamic : DynamicObject
{
    private IDataRecord m_dataRecord;

    public DataRecordDynamic(IDataRecord dataRecord)
    {
        m_dataRecord = dataRecord;
    }

    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        result = m_dataRecord[binder.Name];
        return (result != null);
    }
}
Lớp này đã thực hiện định nghĩa lại phương thức xác định thao tác Get của một thuộc tính động, nó thực hiện xác định giá trị bằng cách sử dụng tên của thuộc tính xem như tên cột và lấy dữ liệu cột tương ứng với tên cột đó trong row dữ liệu nhận được (= Item[string]).
Và dưới đây là ví dụ ban đầu đã được viết lại sử dụng lớp DataRecordDynamic, bạn sẽ thấy rằng bây giờ sẽ dùng row.OrderID và row.CustomerID.
private static IList<dynamic> ExecuteOrderDataReader(string connectionString)
{
    var orderDataRows = new List<dynamic>();

    string queryString = "SELECT [SalesOrderID], [CustomerID] FROM [Sales].[SalesOrderHeader];";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        try
        {
            foreach (IDataRecord record in reader)
            {
                orderDataRows.Add(new DataRecordDynamic(record));
            }

            return orderDataRows;
        }
        finally
        {
            // Always call Close when done reading.
            reader.Close();
        }
    }
}

private static void ReadOrderData2(string connectionString)
{
    var orderDataRows = ExecuteOrderDataReader(connectionString);

    foreach (var row in orderDataRows)
    {
        Console.WriteLine(String.Format("{0}, {1}", row.SalesOrderID, row.CustomerID));
    }
}
Qua ví dụ trên, bạn cũng có thể thấy được sự khác nhau giữa ExpandoObject và DynamicObject, đó là DynamicObject còn cho phép bạn tận dụng được các phương thức, thao tác và thuộc tính sẳn có của một class.

Saturday, March 12, 2011

Dynamic trong C# 4 - Phần 2

Đây là phần tiếp theo của các bài viết về từ khóa dynamic và Dynamic Language Runtime (DLR), đây là tính năng mới trong C# 4 và .NET Framework 4. Trong phần 1 đã giới thiệu về từ khóa dynamic, nội dung của bài này sẽ mô tả về DLR và hai trong số các trường hợp sử dụng thông thường của nó.

Dynamic Language Runtime

Thuật ngữ "dynamic" trong C# thường nhắc đến một trong hai khái niệm: từ khóa dynamic trong C# 4 hoặc là Dynamic Language Runtime (DLR).

DLR phục vụ hai mục đích chính. Một là cho phép liên kết giữa ngôn ngữ động và .NET Framework serves two main goals. Và hai là mang khả năng động vào C# và Visual Basic.

DLR đã được tạo ra dựa trên các bài học trong khi xây dựng IronPython (ironpython.net), là ngôn ngữ động đầu tiên được cài đặt trong .NET Framework. Trong khi làm việc với IronPython, nhóm đã tìm ra phương pháp sử dụng lại cài đặt của mình cho nhiều ngôn ngữ khác, vì vậy họ đã tạo ra một nền tảng cơ bản dùng chung cho các ngôn ngữ động trong .NET.

Sau đó DLR đã được giới thiệu trong .NET Framework 4 để hỗ trợ các tính năng động trong C# và Visual Basic. Nếu bạn chỉ cần từ khóa dynamic trong C# 4, bạn chỉ cần sử .NET Framework và trong hầu hết trường hợp nó sẽ xử lý tất cả các tương tác với DLR trong chính bản thân mình. Nhưng nếu bạn muốn cài đặt hoặc mang một ngôn ngữ động mới vào .NET, bạn cần trợ giúp từ các lớp trợ giúp bên ngoài trong dự án nguồn mở (dlr.codeplex.com) có nhiều tính năng và dịch cho việc cài đặt ngôn ngữ.

Gọi động các phương thức và truyền các tham số

Đây không phải là sự kỳ vọng rằng các bạn nên sử dụng động bất kỳ khi nào có thể thay vì các khai báo kiểu tĩnh. Việc kiểm tra lúc biên dịch là một công cụ mạnh mẽ và nhiều lợi ích giúp bạn làm việc tốt hơn. Và hơn nữa, các đối tượng động trong C# không hỗ trợ IntelliSense, mà có thể làm năng suất công việc của bản giảm xuống.

Sau đây là một ví dụ tuyệt vời cho việc sử dụng DLR, đó là việc thay thế các API reflection để triệu gọi đến các phương thức có truyền tham số.

1. Bạn hãy sử dụng Visual Studio, tạo một ứng dụng C# Console Application có tên LateBindingWithDynamic.
2. Tiếp theo, bạn hãy thêm một Class Library project trong solution hiện tại với tên MathLibrary.
3. Đặt lại tên Class1.cs của MathLibrary thành SimpleMath.cs và cài đặt lớp như sau:
public class SimpleMath { 
    public int Add(int x, int y) 
    { return x + y; } 
}
4. Tiến hành build MathLibrary và copy MathLibrary.dll vào thư mục bin/Debug của LateBindingWithDynamic (Bạn có thể dùng tính năng ShowAllFiles trong VS và kéo thả MathLibrary.dll từ thư mục bin/Debug của MathLibrary vào thư mục bin/Debug của LateBindingWithDynamic).
5. Triệu gọi phương thức Add của thư viện MathLibrary trong LateBindingWithDynamic: Có hai phương pháp triệu gọi ở đây là sử dụng các API reflection và sử dụng từ khóa dynamic.
a/ Phương thức sau sẽ gọi phương thức Add sử dụng các triệu gọi API reflection:
private static void AddWithReflection()
{
    Assembly asm = Assembly.Load("MathLibrary");

    // Get metadata for the SimpleMath type. 
    Type math = asm.GetType("MathLibrary.SimpleMath");

    // Create a SimpleMath on the fly. 
    object obj = Activator.CreateInstance(math);

    // Get info for Add. 
    MethodInfo mi = math.GetMethod("Add");

    // Invoke method (with parameters). 
    object[] args = { 10, 70 };
    Console.WriteLine("Result is: {0}", mi.Invoke(obj, args));

}
b/ Trường hợp sử dụng từ khóa dynamic:
private static void AddWithDynamic()
{
    Assembly asm = Assembly.Load("MathLibrary");

    // Get metadata for the SimpleMath type. 
    Type math = asm.GetType("MathLibrary.SimpleMath");

    // Create a SimpleMath on the fly. 
    dynamic obj = Activator.CreateInstance(math);
    Console.WriteLine("Result is: {0}", obj.Add(10, 70));
}

Trong hai trường hợp trên, bạn sẽ thấy được lợi điểm của việc sử dụng DLR, với việc sử dụng DLR giúp cho việc gọi phương thức và truyền các tham số trong đơn giản và dể hiểu hơn so với cách sử dụng API Reflection.

Khai báo phương thức và thuộc tính động lúc thực thi (Dynamic Method Bags)

Một ví dụ khác mà của dynamic có thể làm được là tạo ra nơi chứa các phương thức động (method bag), tức là các đối tượng có thể thêm và xoá các thuộc tính và phương thức lúc thực thi, và sau đó triệu gọi các phương thức này thông qua triệu gọi động (dynamic dispatch) trong C#.

Trong .NET Framework 4 có một namespace mới: System.Dynamic. Namespace này thực ra là một phần của DLR và được định nghĩa trong gói (assembly) System.Core. Các lớp System.Dynamic.ExpandoObject và System.Expando.DynamicObject cùng với từ khóa dynamic có thể giúp bạn tạo ra các cấu trúc (structure) động và hệ thống thứ bậc (hierarchic) động theo một cách đơn giản và dễ hiểu.
Sau đây là ví dụ diễn tả cách bạn có thể thêm một thuộc tính và phương thức bằng cách sử dụng lớp ExpandoObject như ví dụ dưới đây:

dynamic expando = new ExpandoObject();
expando.SampleProperty = "Đây là thuộc tính được thêm lúc thực thi";
expando.SampleMethod = (Action)(
    () => Console.WriteLine(expando.SampleProperty));
expando.SampleMethod();

Dưới đây là một ví dụ về việc đọc dữ liệu từ XML. Trong ví dụ này đã sử dụng class ExpandoObject để lưu trữ dữ liệu nhận được từ XML, bạn có thể truy cập dữ liệu này thông qua các thuộc tính tự động được thêm vào lúc đọc dữ liệu và thực hiện thêm phương thức GetFullName để mô tả khả năng đưa thêm phương thức trong lúc chạy chương trình.
Dữ liệu trong XML có cấu trúc như sau:

  
     Thanh 
     Ho Hai 
  
  
     Phuong Linh 
     Ho Hoang 
  

Và dưới đây là toàn bộ đoạn code :
public static IList<dynamic> GetExpandoFromXml(String file)
{
    var persons = new List<dynamic>();

    var doc = XDocument.Load(file);
    var nodes =
        from node in doc.Root.Descendants("Person")
        select node;

    foreach (var n in nodes) {
        dynamic person = new ExpandoObject();

        //Đọc các giá trị tương ứng với FirstName và LastName của mỗi Person
        foreach (var child in n.Descendants()) {
            // Bởi vì ExpandoObject được cài đặt interface IDictionary<string, object>
            // và xem như mỗi phần tử của Dictionary gồm có thuộc tính và giá trị
            var p = person as IDictionary<string, object>;

            //person được thêm 2 thuộc tính là FirstName và LastName
            p[child.Name.ToString()] = child.Value.Trim();
        }
        
        //Cài đặt phương thức lấy đầy đủ họ tên cho person
        person.GetFullName = (Func<string>)(() =>
        {
            return string.Format("{0}, {1}", person.FirstName, person.LastName);
        });

        persons.Add(person);
    }

    return persons;
}
Và bạn có thể truy cập dữ liệu đọc được ở trên bằng các thuộc tính và phương thức đã được thêm vào cho mỗi đối tượng ExpandoObject lúc thực thi như sau:
IList<dynamic> persons = GetExpandoFromXml("Persons.xml");
foreach (var p in persons)
{
    Console.WriteLine(p.GetFullName());
}
Trên đây là hai trong số những kịch bản mà bạn có thể sử dụng DLR trong C# 4, trong những bài tiếp theo, tôi sẽ mô tả về các tính năng cao cấp khác của DLR.

Friday, March 11, 2011

Dynamic trong C# 4 - Phần 1

Từ khóa dynamic và Dynamic Language Runtime (DLR) là những tính năng mới trong C# 4 và Microsoft .NET Framework 4. Bài viết này cung cấp những cái nhìn khái quát về tính năng dynamic trong C# 4.

Dynamic là gì?

C# và Java thường được xem là ngôn ngữ lập trình tĩnh, trong khi Python, Ruby và JavaScript là những ví dụ của ngôn ngữ động.
Thông thường, ngôn ngữ động không thực hiện kiểm tra kiểu tại thời điểm biên dịch chương trình và chỉ nhận dạng kiểu đối tượng tại thời điểm chạy chương trình. Điều này giúp cho việc viết code đơn giản và nhanh hơn, nhưng lúc đó bạn không nhận được lỗi biên dịch và chỉ đến khi thực hiện kiểm thử rất cẩn thận mới đảm bảo được chương trình bạn được viết chính xác.
Trong C# 4, từ khóa dynamic đã được bổ sung để cải thiện khả năng tương thích với các ngôn ngữ và nền tảng (framework) động..
Dưới đây là ví dụ về việc sử dụng từ khóa dynamic:

static void ChangeDynamicDataType()
{
 dynamic t = "Hello!";
 Console.WriteLine("t is of type: {0}", t.GetType());

 t = false;
 Console.WriteLine("t is of type: {0}", t.GetType());

 t = new System.Collections.Generic.List();
 Console.WriteLine("t is of type: {0}", t.GetType());
}
Output:
t is of type: System.String
t is of type: System.Boolean
t is of type: System.Collections.Generic.List`1[System.Int32]

Như bạn thấy, nó có thể gắn với các đối tượng có kiểu dữ liệu khác nhau vào biến được khai báo dynamic. Đoạn code được biên dịch bình thường và được định danh tại thời điểm chạy (runtime). Tuy nhiên, đoạn code sau sẽ được biên dịch bình thường, nhưng sẽ xuất hiện ngoại lệ (exception) tại thời điểm chạy:

dynamic d = "Hello!";

//Dòng sau sẽ xuất hiện ngoại lệ thời điểm chạy.
d++;
Output:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException was unhandled
  Message=Operator '++' cannot be applied to operand of type 'string'
  Source=Anonymously Hosted DynamicMethods Assembly

Bởi vì trình biên dịch không thể biết kiểu của đối tượng tại thời điểm chạy và do đó không thể nói với bạn rằng thao tác '++' không được hổ trợ trong trường hợp này.

Sử dụng từ khóa dynamic, object hay var?

Vậy sự khác nhau giữa dynamic, object và var như thế nào và khi nào bạn nên dùng chúng?
Từ khóa object mô tả cho kiểu System.Object, là lớp cha trên cùng trong phân cấp lớp C#, và có thể diễn tả cho bất cứ lớp nào khác. Nó được sử dụng khi không thể định danh được kiểu đối tượng tại thời điểm biên dịch và bạn cần sử dụng lệnh chuyển đổi sang một kiểu định nghĩa trước nếu muốn sử dụng các phương thức hoặc thuộc tính của kiểu đó.

static void UseObjectVarible()
{
 // Giả sử có một lớp tên Person.
 object o = new Person() { FirstName = "Thanh", LastName = "Ho" };

 // Phải đổi kiểu đối tượng thành Person
 // để có thể sử dụng các thuộc tính của Person.
 Console.WriteLine("Person's first name is {0}", ((Person)o).FirstName);
}

Từ khóa var được đưa ra từ C# 3.0, được sử dụng đại diện các kiểu đã được định nghĩa sẳn hoặc kiểu nặc danh. Một biến được khai báo var sẽ được định danh kiểu tại thời điểm biên dịch và không thể thay đổi kiểu lúc runtime. Nếu trình biên dịch không thể xác định được kiểu, nó sẽ tạo ra lỗi biên dịch:

var varExample = 10;
Console.WriteLine(varExample.GetType()); // In ra System.Int32

//Biến varExample là kiểu System.Int32:
varExample = varExample + 10;

//Dòng này sẽ bị lỗi khi biên dịch và chỉ có thể gán giá trị số nguyên cho varExample:
varExample = "test";

Từ khóa dynamic, được giới thiệu trong C# 4, tạo ra các kịch bản khác dựa trên từ khóa object truyền thống nhưng đơn giản hơn trong viết và maintain code. Thực tế, kiểu dynamic sử dụng kiểu System.Object nhưng không như object, nó không đòi hỏi việc đổi kiểu lúc biên dịch, mà chỉ định danh thời điểm chạy:

static void UseDynamicVarible()
{
 // Giả sử có một lớp tên Person.
 dynamic p = new Person() { FirstName = "Thanh", LastName = "Ho" };

 //Có thể sử dụng các thuộc tính của Person mà không cần đổi kiểu.
 Console.WriteLine("Person's first name is {0}", p.FirstName);
}

Qua phần này, bạn có thể hiểu và sử dụng được từ khóa dynamic, một trong những tính năng mới của C# 4, Dynamic Language Runtime (DLR) sẽ được trình bày trong phần tiếp theo.

Wednesday, February 23, 2011

Sử dụng Table-Valued Parameter trong SQL Server 2008 và ADO.NET

Table-Valued Parameter đưa ra cho bạn một phương pháp đơn giản để truyền dữ liệu từ ứng dụng vào SQL Server mà không phải thực hiện các vòng lặp hoặc các xử lý dữ liệu logic phức tạp phía server. Bạn có thể chuyển toàn bộ các dòng dữ liệu trong ứng dụng và gửi về server chỉ bằng một tham số đơn của câu lệnh SQL.

Saturday, February 19, 2011

What is SOLID?

SOLID is a collection of best practices object-oriented design principles. The principles when applied together to make a system that is easy to maintain and extend over time. The principles of SOLID are guidelines that can be applied while working on software to remove code smells, to refactor the software's source code until it is both legible and extensible. It may be used with test-driven development, and is part of an overall strategy of agile and adaptive programming.

SOLID is abbreviated by Single Responsibility, Open Closed, Liskov Substitution, Interface Segregation and Dependency Inversion.

1. Single Responsibility Principle: A class or module should have one, and only one, reason to change.

2. Open Closed Principle: Software Entities (Classes, Modules, Functions, and so on) should be open for extension but closed for modification.

3. Liskov Substitution Principle: Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

4. Interface Segregation Principle: Many client specific interfaces are better than one general purpose interface.

5. Dependency Inversion Principle:

a. High level modules should not depend on low level modules. Both should depend on abstractions.

b. Abstractions should not depend upon details. Details should depend upon abstractions.