Tâm sự ngày mưa bão: model và những người bạn

♬ Lyric ♬
Từng cơn sét giật trong bóng đêm
Hat mưa lạnh rơi buốt thêm

Nay bão số 3 tiến về Hà Nội, nằm trong căn phòng trống sau khi ăn bữa cơm tối một mình, lòng mình tràn ngập những ngổn ngang suy nghĩ về cuộc sống của lứa tuổi này: tình yêu, sự nghiệp, gia đình, bạn bè.. Đặc biệt là nỗi sầu lo mà ngày nào cũng phải đối mặt, cứ nghĩ đến nó thôi là đã thấy sợ, tâm tư của mình chắc cũng như các bạn trẻ bây giờ thôi đó là mai ăn gì :))

Thôi đùa vậy thôi. Lâu nay mình hay viết mấy cái linh tinh về chuyện coding rồi nên nay mình muốn tập trung hơn về code hơn đó là việc validate dữ liệu của model.

 

Chắc anh em code cỏ ngại nhất cái khoản ngồi validate đống dữ liệu đầu vào phải không nào, nào là độ dài, nào là có nhập hay không, có phải kiểu số hay không… Mấy đoạn code đó thì thôi rồi có khi dài cả mét ấy chứ.

e19a33c87ec3007fdecbfdd575413dc36cc93ecb5d6a1de452c4c0912585f915

Mấy dự án bên mình thì thôi rồi validate cả đống luôn, mỗi lần fix xong build lại rồi lại đưa lên hệ thống rồi lại test lại. Mệt !!!!!!!!!!!!!

6ae43ab9f98bf811081ff99c67b72e13496430597491555e1840af2fe866570a

Thằng .NET MVC có cái DataAnnotaion dùng để validate cũng mạnh nhưng lại cho bản .NET mới chưa kể nó vẫn bị phụ thuộc mình phải quy định trong code nên khi cần sửa thì lại mò lại code và build.

Chính vì vậy mình đã ngồi ngẫm lại rồi viết ra 1 cái validator đơn giản để 500 anh em có thể sử dụng file XML quy định các kiểu validate cho property của model.

Trong quá trình runtime thì chương trình sẽ truy cập vào file XML để xem việc các quy định của thuộc tính về độ dài, kiểu dữ liệu, bắt buộc hay không… rồi từ đó tiến hành validate.

Điều này sẽ giúp anh em đỡ phải đau đầu khi cần điều chỉnh kiểu validate hay thay đổi giá trị.

Sourcecode: https://github.com/hoangnl/AutomationValidator

Cấu trúc của project thì như sau:

Untitled

Attribute: các kiểu validate. Trong project mình có viết tạm 2 attribute dùng cho validate bắt buộc hay không và có quá độ dài hay không. Các bạn có thể viết thêm bao nhiêu attribute tùy ý, lưu ý cần kế thừa interface IDbValidation. Cái Validator thì là thằng để validate các thuộc tính thông qua các attribute được quy định

Models: quy địnhc ác model cần validate. Ở đây mình ví dụ 2 thằng Person và Address

Xml: chứa file XML dùng để quy định các thuộc tính các loại validate của thuộc tính

Đọc file này có nghĩa là mình quy định cho các class Person và Address về các thuộc tính LastName, FirstName, City hay State có nhập hay không, độ dài không được quá 5 kí tự,…

Schema: trong cái này mình chứa file Schema được generate từ file XML bên trên thông qua công cụ của thằng Visual Studio. Anh em mở cmd for visual rồi gõ

xsd validator.xml

Gõ cái này xong thì nó sinh cho mình cái file xsd như trong project

Untitled

Từ file xsd này mình sẽ generate ra 1 file class để quy định các thuộc tính của schema. Cái này cũng dùng cmd for Visual. Cú pháp là

xsd /c Validator.xsd

Thế là ra file cs. Copy mấy thằng này vô project dùng cho tiện :3

Untitled.png

Manager:

  • CustomTypeDescriptionProvider: thằng này dùng để add thêm attribute cho các property của class trong quá trình Runtime chương trình.
  • ValidationManager: thằng này dùng để đọc thông tin attribute từ file XML.

Mấy cái này giải thích lâu lắm. Anh em chịu khó đọc hiểu nhé. Mình sử dụng chủ yếu Reflection của thằng C# nên có thể đọc code hơi rối :))

Giờ thì chạy thôi. Anh em sẽ được như hình

Untitled

Thật là vi diệu phải không

13704e116845b0c38e5d173c9633cc0a57f1a0255900cb97552ddf17720d1377

Tham khảo:

http://geekswithblogs.net/abhijeetp/archive/2009/01/10/dynamic-attributes-in-c.aspx http://www.primaryobjects.com/2012/05/16/loading-c-mvc-net-data-annotation-attributes-from-xml-form-validation/

Còn cái link sử dụng attribute để validate thì lâu lắm rồi mình chẳng tìm được. :)) Anh em chịu khó đọc code cái file Validator để xem nhé

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s