Dependency Injection with Spring.Net p2

(Bài viết dịch từ bài Dependency Injection with Spring.Net của David Consdorf, thêm hành thêm tiêu rồi nấu lại bởi Nguyễn Thoại :bbpraroi:)



-Trong
phần đầu, các bạn đã được giới thiệu về khái niệm Dependency Injection (DI), khả năng ứng dụng Dependency Injection trong những mẫu thiết kế FactorySpring.NET. Ở phần 2 này, tác giả sẽ hướng dẫn rõ cho bạn cách sử dụng Spring.NET để đưa DI vào chương trình một cách dễ dàng nhờ vào 1 file cấu hình xml.



- Vậy Spring.NET nên được sử dụng trong trường hợp nào. Như chúng ta đã biết, phần nhân chính của Spring.NET framework đưọc thiết kế trên ý tưởng của những Factories và Dependency Injection. Nói theo cách khác, Spring.NET là một hệ thống factory cho phép chúng ta có thể cấu hình các đối tượng trong ứng dụng. Thay vì phải tự code những mẫu factory phức tạp, chúng ta có thể sử dụng Spring.NET và nối kết những đối tượng trong chương trình nhờ vào 1 file xml.

- Tôi có thể tiếp tục về đề tài này nhưng tôi thấy đã nói hơi nhiều về lý thuyết. Cho nên chúng ta nên xem 1 ví dụ. Trong bài viết này, tôi sẽ giới thiệu với các bạn framework và cho các bạn thấy một ví dụ nhỏ về web application có sử dụng nguyên lý Dependency Injection của Spring.NET. Bạn nên chú ý rằng có nhiều cách để áp dụng Dependency Injecttion trong Spring.NET và ví dụ của tôi không phải là một demo thể hiện hết mọi thứ của Spring, tuy nhiên đây là một khởi đầu tốt cho những ai muốn làm quen với framwork này.

Các bạn có thể download code mẫu ở đây: Download Code Examples.

Configuring Spring.NET

- Chúng ta hãy bắt đầu bằng việc đưa Spring.NET vào project của mình. Đầu tiên, các bạn download Spring.NET library ở www.springframework.net và thêm những assemblies vào project. Trong ví dụ này chỉ cần core assembly tuy nhiên bạn vẫn có thể thêm vào những dll khác nếu thích.

Kế tiếp, bạn hãy đưa đoạn code sau đây vào Web.config hoặc App.config


<configSections>
<sectionGroup name="spring">

<section name="context"
type="Spring.Context.Support.ContextHandler, Spring.Core" />
<section name="objects"
type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />

</sectionGroup>
</configSections>

<spring>
<context>
<resource uri="config://spring/objects" />
</context>
<objects xmlns="http://www.springframework.net">
<!—- ToDo: Put mappings here. -->
</objects>
</spring>

Hình 1: Spring.Net Configuration


- Đây chỉ mới là bước cấu hình cơ bản để có thể sử dụng được Spring.NET. Ở bước này bạn có thể thêm vào những node để định nghĩa các đối tượng (object) của bạn vào bên trong thẻ objects.

A Simple Messages Object

- Chúng ta sẽ định nghĩa một lớp SimpleMessage đơn giản như sau. Ví dụ này sẽ chỉ cho bạn cách thêm vào phần định nghĩa của 1 object trong file cấu hình của Spring.

public interface ISimpleMessage {
String Message { get; }
}

public class SimpleMessage : ISimpleMessage {
private String _message;

public SimpleMessage() {
}

public SimpleMessage(String message) {
_message = message;
}

public String Message {
get {
return _message;
}
set {
_message = value;
}
}
}
Hình 2: Simple Message Object


- Nếu các bạn chú ý sẽ thấy Interface của chúng ta chỉ có khai báo Getter mà không có Setter, điều này có nghĩa là đối tượng message được mong đợi là đã có sẵn giá trị khi có một đối tượng khác truy xuất nó thông qua interface. Kế tiếp, chúng ta thêm phần mapping cho đối tượng SimpleMessage trong file cấu hình của Spring.NET


<objects xmlns="http://www.springframework.net">

<!-- Messages -->
<object name="SimpleMessage" type="SimpleMessage, __Code" singleton="false">

<constructor-arg name="message" value="Hello, I am a simple message set
by using constructor-based dependency injection.
" />
</object>

</objects>
Hình 3: Simple Message Object Mapping

- Những gì bạn thêm vào ở trên là bạn đang hướng dẫn cho Spring cách thiết lập 1 đối tượng. Tên lớp (class name) sẽ được sử dụng để tạo ra đổi tượng tương ứng, có nghĩa là Spring sẽ tạo ra đối tượng từ tên lớp (class name) mà bạn cung cấp. (Chú ý rằng “__Code” là 1 generic namespace cho những ứng dụng web. Trong những ứng dụng dạng khác thì chúng ta sẽ sử dụng namespace đầy đủ). Một điểm lưu ý khác là property “Singleton” đuợc chỉnh thành false trong ví dụ trên. Bạn sẽ được giải thích về ý nghĩa và cách sử dụng Singleton pattern sau.

- Cuôi cùng, nếu nhìn lại đoạn code định nghĩa lớp SimpleMessage của chúng ta thì bạn sẽ thấy property Message sẽ được set trong khi thiết lập (construct). Vì vậy khi đối tượng được tạo ra, giá trị của property Message sẽ được set trong constructor.

- Bây giờ, chúng ta hãy thêm vào đoạn code để tạo ra đối tượng ta cần bằng Spring.NET

// Get Spring.Net context
using (IApplicationContext ctx = ContextRegistry.GetContext()) {

// Get a new instance of the message object
ISimpleMessage simpleMessage1 = (ISimpleMessage)ctx.GetObject("SimpleMessage");

// Read the message objects message as initialized by Spring.Net
ltlSimpleMessage1.Text = simpleMessage1.Message;
}

Hình 4: Retrieve Simple Message from Spring.Net Context

- Thật là dễ phải không các bạn. Tất cả những gì đoạn code phía trên làm là lấy Spring.NET application context và sau đó sử dụng context này để tạo ra 1 instance của đối tượng SimpleMessage. Đoạn code trên chỉ biết tên của đối tượng và interface cần sử dụng. Nó không biết (reference) cụ thể lớp nào đã implement interface đó và cũng chẳng cần lo đến chuyện set giá trị cho property Message vì Spring.NET sẽ làm điều đó cho chúng ta.


Phần 1

Phần 3

Phần 4

Phần 5

Phần 6

(Các bạn đang xem phần 2)

1 comments:

  1. Unknown Says:

    Quá tuyệt vời, mình đang cần cái này mà không biết sử dụng, thanks nhé.

    Web 4 You Pro

rss
 

About Me

Place I've live
Near Bossley Park, Sydney, NSW, Australia
Place I've work
  • Freelancer (from 06/2010 to present)
  • Harvey Nash (from 05/2008 to 06/2010)
  • DataDesign Vietnam (10/2005 to 04/2008)
Place I've studied
  • University of Natural Science (Bachelor of Science HoChiMinh City Vietnam From 2001 to 2005)
  • Le Hong Phong High School (HoChiMinh City Vietnam From 1997 to 2000)