Wednesday, May 13, 2009

Spring.net usage 1

Hình bên dưới là thiết kế hiện tại cho project WebUI, hay gọi là package WebUI. Hầu hết các business logic sẽ nằm ở package khác. Login được gọi là Service là một vấn đề khác tạm không bàn tới. Nó được đặt trong WebUI vì có dùng đến FormsAuthentication của asp.net. Ngoài LoginService thì còn có ErrorSerive và ReportService cũng được đặt trong package WebUI.


Theo qui ước, Client không được phép sử dụng concrete class LoginService mà chỉ depend trên ILoginService. Việc khởi tạo object LoginService sẽ do Spring đảm trách.

Cách thiết kế này có vấn đề gì? Tăng tính flexible vì dễ dàng thêm và thay thế bằng AnotherLoginService thông qua cấu hình Spring mà Client không cần thay đổi. Không đáng để như thế. Tại sao chúng ta không tạo IKeyNotFoundException và "spring" nó với KeyNotFoundException?

OK. Vậy có tính chất khác đủ thuyết phục hơn cách lập luận phủ định không?

Có. Thiết kế như trên làm giảm tính cohension của package WebUI. Tất cả các lớp trong cùng một package cần có mối liên kết chặt chẽ nhất có thể. LoginService và Client cùng package nên lệ thuộc trực tiếp với nhau và gia tăng tính cohensive của package.

Dường như đây không phải lời khuyên thường thấy? Có thể đúng, có thể không chính xác.

Client depend lên ILoginService thì tốt hơn, có thể bằng cách nhận ILoginService trong hàm khởi tạo:

class Client {
public Client(ILoginService login) { ... }
...
}

Cũng có nghĩa là ở một nơi nào đó trong package WebUI, sẽ có 1 nơi khởi tạo object từ class LoginService. Điều này vẫn giúp duy trì tính cohension chặt.

Dependency Injection không cần thiết mặc dù chương trình vẫn chạy.

Taiichi Ohno nói rằng: hao phí lớn nhất trong sản xuất chính là sản xuất thừa.

No comments: