Viết ASP.NET bằng MVP. cùng NHibernate phần 1 - Domain Classes

Posted On Tuesday, October 14, 2008 at at5:đôi mươi PM by Unknown 

Bài viết này được dịch, tóm tắt và bổ sung cập nhật dựa vào bài viết NHibernate Best Practices with ASPhường.NET, 1.2nd Ed trên code Project. Các code sample vào bài xích phụ thuộc database Northwind của Microsoft cùng tìm hiểu thêm 100% trường đoản cú code mẫu mã của người sáng tác Billy McCafferty.

Bạn đang xem: Nhibernate là gì

I/ Introduction - Why use an ORM?Lúc bấy giờ vẫn có tương đối nhiều người không gật đầu những technology ORM, nói tầm thường này thường là những người dân thích hợp dùng vật chơi của Microsoft. Giang hồ nước thông thường có một nguyên lý bất thành vnạp năng lượng rằng “trường hợp nó đang chưa được Microsoft nghĩ ra thì nên cần hóng xem Microsost giới thiệu giải pháp làm trước”. Cho bắt buộc sau một thời hạn được chờ đợi thời gian lâu hơn, Microsoft cũng nghĩ về ra LinQ to Entities vào C# 3.0. Vậy là thời khắc hiện nay, thiết kế viên được gạn lọc các technology ORM nhằm sử dụng. Trong số những người dân ko say mê ORM, gồm những người dân cho rằng ORMs vẫn có tác dụng sút performance của công tác với chúng chỉ giúp tinh giảm những phase đầu trong quy trình cách tân và phát triển công tác (có tác dụng Data Acess Layer). Một số chủ kiến còn cho rằng thực hiện ORM còn có thể gây trở ngại vào bài toán maintain project. Và chỉ đến khi những sự việc trên được chú ý thì tín đồ ta bắt đầu nhìn nhận thêm các thực sự sau:+ Dưới sự cung cấp của ORMs điển hình nổi bật nhỏng NHibernate sẽ có tác dụng tăng performance của người tiêu dùng với cưng cửng vị là 1 trong thiết kế viên. Càng tốn nhiều thời gian để triển khai data access layer thì thời hạn sót lại của chúng ta để làm phần đa phần không giống cũng giống như tối ưu hóa lịch trình (giả dụ yêu cầu thiết) sẽ sụt giảm. Khi ta sử dụng một trong những profiling tool nhằm phát hiện ngulặng nhân chạy lờ lững thì sẽ phát hiện một số ít nơi vào code là hung thủ, lúc đó bọn họ buộc lòng đề xuất triển khai những sửa đổi cần thiết nhằm giải quyết và xử lý. Trong phần đông ngôi trường phù hợp như vậy thì bao gồm hay không gồm sử dụng ORM những tương đồng. Mặc mặc dù rất ít gặp nhưng mà nếu thủ phạm tạo cho lịch trình chạy đủng đỉnh là ORM framework với không tồn tại bí quyết như thế nào nhằm sửa code thì ta vẫn còn đó một chiêu cuối là nạm luôn luôn một ORM framework không giống, thậm chí là implement lại data access layer theo cách của bản thân mình trường hợp như bạn có nhu cầu, tất yếu chỉ có tác dụng được như thế khi data access layer của họ được tổ chức khéo léo bằng phương pháp áp dụng nhiều abstraction.+ Điểm thiết bị hai đối với những ORM, đặc biệt là NHibernate framework, vẫn hỗ trợ tất cả các từng trải đối với một framework truy tìm xuất cơ sở tài liệu. Nó góp tiết kiệm chi phí công sức của con người của thiết kế viên, hỗ trợ cho công tác chạy bất biến với dễ dàng maintain. Tất nhiên caching cũng rất được cung cấp trong NHibernate. Dường như, các feature khác ví như lazy-loading, inheritance, generics, cung cấp stored procedure cũng có vào NHibernate.+ Điểm cuối cùng, những người luôn nhận định rằng ORMs nhỏng NHibernate sẽ cực nhọc maintain sau đây đó là những người đang thao tác với đầy đủ khối hệ thống ứng dụng đang không có phong cách thiết kế tốt để có tác dụng maintain bất kể một data access layer như thế nào. Vì vậy, mặc dù Nhibertate là một trong chọn lọc xuất sắc cho số đông chương trình thực hiện database thì không Tức là các bạn không quan trọng kế lịch trình thật xuất sắc.- Không rất cần phải nói nhiều nữa, cũng như các ORM tools khác, NHibernate đang giảm bớt hàng vạn loại code cũng giống như những stored procedures cho chúng ta, vì thế nó được cho phép bọn họ dành riêng thời hạn và sức lực lao động cho phần thiết yếu của chương thơm trình: domain mã sản phẩm với bussiness xúc tích.II/ Defining the Domain Layer- Lúc thao tác làm việc với project .NET bao gồm áp dụng database, chắc hẳn rằng câu hỏi thứ nhất mà nhiều người dân đã làm cho là viết các lớp Domain. Lớp Domain tốt còn được gọi là Entity là lớp C# tương xứng với một table trong database. Các property trong những lớp Entities cũng tương xứng cùng với những column trong table đó, và tất yếu vẻ bên ngoài tài liệu của bọn chúng cũng tương ứng 1:1 với nhau. NHibernate đã áp dụng những lớp Entities được có mang trong project kết phù hợp với những tệp tin XML cơ mà bọn họ sẽ tạo nên ra và phụ thuộc đó để truy tìm xuất database. Các tệp tin XML này thường chọn cái tên ứng cùng với thương hiệu lớp của bọn họ, ví dụ ta gồm lớp Customer.cs thì fan ta thường tạo ra một tệp tin khớp ứng là Customer.hbm.xml. HBM là chữ viết tắt của Hibernate mapping. Nội dung xml của chính nó đang dùng để mapping các field của lớp cùng với các column trong database và tất nhiên họ bắt buộc viết theo đúng quy biện pháp của NHibernate. Quy tắc đánh tên tệp tin nlỗi tôi nói tại đây chỉ nhằm mục tiêu dễ dàng quản lý, thực ra chúng ta vẫn có thể viết toàn bộ những đoạn XML mapping vào cùng 1 tệp tin và khắc tên tệp tin xml này tuỳ ý vày NHibernate sẽ được chỉ định khu vực nhằm tìm kiếm các nội dung XML này trong tệp tin app/website config. Các file XML này sẽ được build cùng rất projects như thể các embeded resources đề nghị họ nên chăm chú mang đến chi tiết này lúc thêm các tệp tin HBM vào project.- Nlỗi sẽ nói thì các lớp Entity đã khớp ứng với những table vào database. Về triết lý bạn có thể viết tên những property tuỳ ý không cần phải theo tên của column vào database, NHibernate vẫn riêng biệt được cùng biết phương pháp map thân property làm sao với column như thế nào vào database. Nhưng để dễ dàng nắm bắt cùng dễ dàng gia hạn, fan ta thường tự giác đặt tên bọn chúng như nhau. Sau đó là ví dụ về một lớp Entity và văn bản XML mapping tương ứng cùng với nó:
*
cssheader= header= body=<1 Domain class với xml tệp tin mapping tương ứng>" />
*
cssheader= header= body=<1 Domain class và xml tệp tin mapping tương ứng>" />
Code 1: 1 Domain class cùng xml tệp tin mapping tương ứng- bởi thế Domain layer của bọn họ sẽ sở hữu các lớp Entity, các tệp tin HBM khớp ứng. Chúng ta đã viết tên mang lại project cất các tệp tin này là XXXX.Core. Dường như, project này còn đựng những interface của những data access object. Và vày bọn họ là những người tất cả tổ chức triển khai bắt buộc các interface này sẽ tiến hành đặt trong một thỏng mục riêng: DataInterrfaces với vị vậy namespace của các Interface vào tlỗi mục này vẫn tương xứng cùng với tên tlỗi mục của nó: EnterpriceSample.Vi xử lý Core.DataInterfaces. Chúng ta đang bàn chi tiết quá trình chế tác những file interface này ở trong phần hai; còn vì sao nên đặt nó sinh hoạt Domain Layer sẽ tiến hành phân tích và lý giải tức thì tiếp sau đây.

II.1 Separated Interface, Implemented

- Trong project EnterpriceSample.bộ vi xử lý Core không cất bất cứ phần code như thế nào implement những data access object, chúng ta vẫn chỉ định và hướng dẫn nghĩa những interface của chúng. Các lớp DAO implement những interface này sẽ tiến hành đặt ở một layer không giống, này sẽ là project EnterpriceSample.Data. Các bước làm này có vẽ tương đối lạ lùng, bởi họ vẫn quen thuộc cùng với suy nghĩ layer trên sẽ nhờ vào vào layer dưới, tầng web sẽ reference đến tầng Service, Service đang phụ thuộc vào vào Data Access Layer. Thế mà lại tại chỗ này ta vẫn làm không giống đi một ít, tầng Service tuyệt tại đây gọi là Vi xử lý Core sẽ không còn dựa vào vào Data, trở lại nó đã khai báo một số Interface nó nên thực hiện và các lớp DAO vào tầng Data sẽ đề xuất phụ thuộc vào vào layer Core này cùng implement những Interfaces được khai báo trong số ấy. Kĩ thuật này được Call là “Separated Interface”. Nếu như chúng ta gọi EnterpriceSample.Vi xử lý Core là 1 “uppler-màn chơi layer” cùng EnterpriceSample.Data là “lower-level layer” thì: "each of the upper-level layers declares an abstract interface for the services that it needs. The lower-level layers are then realized from these abstract interfaces. ... Thus, the upper layers do not depover on the lower layers. Instead, the lower layers depkết thúc on abstract service interfaces declared in the upper layers" (Robert Martin).

Xem thêm: Con Trai Phát Triển Chiều Cao Đến Bao Nhiêu Tuổi? Nam Giới Bao Nhiêu Tuổi Thì Ngừng Cao Lớn


*
cssheader= header= body=" />
Các bạn đang xem nội dung bài viết ASPNET bởi MVPhường với NHibernate từ bỏ blog của Nguyễn Thoại (http://londonrocknroll.com)
- Chúng ta sẽ bàn về công việc chế tạo những Interface này ở bài bác sau.

II.2 Generic IDs và Object Comparisons

- Trong project EnterpriceSample.bộ vi xử lý Core, đa số những lớp Domain/Entity inherits từ lớp DomainObject. Lớp này khai báo một số function nhằm giao hàng trong câu hỏi so sánh hai đối tượng thuộc loại. Domain Object là 1 lớp Generic, nó thừa nhận vào trong 1 mẫu mã dữ liệu dùng làm knhì báo ID của một domain name object. Generic property thứ hạng này được cho phép ta khái niệm chung những lớp bao gồm property ID hình dáng string nhỏng lớp Customer với cả những lớp gồm property ID kiểu long; ví như Order. Các chúng ta cũng để ý rằng ID này chỉ knhị báo public getter nhưng cấm đoán public setter. Giả sử ta đem một Customer tự database cùng vô tình chuyển đổi giá trị ID của nó rồi save sầu lại, tài liệu này sẽ ghi đnai lưng vào record của Customer không giống trong database. Vì vậy những lớp Entity nên làm được khai báo ID cùng với setter là protected, tức là chỉ NHibernate đang hiểu database vả chỉ nó được set những thông tin đó vào Domain object của chúng ta. Nhưng sẽ có được một số trường phù hợp những domain name object rất cần được phối giá trị đến ID của bọn chúng. Với rất nhiều trường vừa lòng như vậy, ta hoàn toàn có thể áp dụng một giải pháp work-around là viết một function để Set ID như ý mong mỏi. Mỗi lần thực hiện hàm này buộc bọn họ đề xuất nghĩ về tới các trường hòa hợp save sầu đtrằn tài liệu không nghĩ tới trước. Trong bài viết, người sáng tác có trình làng thêm 1 interface là IHasAssignedId để giúp đỡ họ thao tác làm việc này. Đoạn code sau đây đang biểu lộ cách thực hiện interface này:
*
cssheader= header= body=" />
Code 2: Cách thực hiện interface IHasAssignedId- Trong code chúng ta thấy lớp Customer tất cả knhì báo implement interface IHasAsssigneed và phía bên trong thân code của chính nó đã yêu cầu implement method SetAssignedIDTo. Trong khi thân hàm có thực hiện các public static method của lớp Cheông xã. Đây là 1 lớp Util chúng ta sử dụng để đánh giá các ràng buộc và sẽ được nói vào bài viết không giống.

II.3 Mapping the Domain to lớn the Database

- Trong NHibernate có nhì phương pháp để map những domain name objects vào database.: HBMs áp dụng những tệp tin XML với sử dụng các Attribute. Thuận lợi bao gồm Khi sử dụng XML mapping là bọn chúng hoàn toàn chủ quyền với hầu hết lớp C# nhưng mà bọn chúng miêu tả. Điều này hỗ trợ cho lớp Domain của bọn họ giữ lại được đặc điểm nhỏng một POCOs (plain old C# objects). Nhưng bù lại các tệp tin mapping xml lại ra đời một bất lợi chính là bọn họ buộc phải tốn tương đối nhiều công sức để lưu lại cho đầy đủ nội dung mapping nên luôn luôn chính xác thân khái niệm lớp và cấu tạo database:
*
cssheader= header= body=" />
Code 4: Quan hệ thân các Entity được khai báo đúng quy biện pháp vào XML mapping file- Các bạn thấy rằng nhì lớp Product với Suplier tất cả tình dục với nhau, với trong xml mapping data tương xứng cũng đều có quan hệ tình dục one-to-many nhằm biểu thị buộc ràng này. Nếu như họ gồm chuyển đổi database, thì vấn đề tiếp theo bắt buộc làm cho ngay là sửa file mapping này theo biến đổi kia.- Ngược lại sử dụng Attribute nhằm map lại buộc chúng ta can thiệp thẳng vô code, tuy vậy được cái từ thời điểm cách đây giúp cho vấn đề mapping đơn giản và dễ dàng rộng. Sử dụng Attribute để bản đồ làm cho lớp Domains của họ trngơi nghỉ đề nghị giống như Lúc sử dụng Active sầu Record. Ngoài câu hỏi can thiệp thẳng vào code của các lớp Domain, bí quyết làm cho này còn buộc họ đề nghị reference tới NHibernate.Mapping.Attributes cùng khiến cho Domain Layer của bọn họ thiếu tính tính chủ quyền cùng với các assembly đáng lẽ chỉ mở ra trong tầng Data. Dường như có một convention bình thường là domain name layer cần hòa bình với đầy đủ gì của data layer. lúc làm cho đúng như vậy, bạn sẽ không cần bận tâm khi cần phải có sự đổi khác ngơi nghỉ data layer. Do kia, bất kể bao giờ chế tác một project mới, ta bắt buộc quyết định xem yêu cầu sử dụng ORM nào; thực hiện phối hợp những thứ một thời điểm rất có thể tạo ra confusion khi ta lần khần object làm sao phải đề xuất map cùng chiếc làm sao không cần thiết nhằm bản đồ. Dù sao đi nữa thì chính là kinh nghiệm tay nghề của tác giả rất rất đáng để tham khảo; còn đoạn code sau đây đang cho thấy thêm biện pháp áp dụng NHibernate mapping bởi Attributes:
Các bạn đang xem bài viết ASPNET bởi MVP cùng NHibernate tự blog của Nguyễn Thoại (http://londonrocknroll.com phong.londonrocknroll.com.com)
(Nếu mong sử dụng Attribute nhằm mapping, các bạn nên download thêm 1 assembly là NHibernate.Mapping.Attributes trên sourceforce mới sử dụng được.)

II.4 NHibernate Support for Stored Procedures

- Nếu bạn có nhu cầu map công dụng trả về của một Stored Procedure về thì làm vậy nào? Cũng nlỗi các ORM tool khác, NHibernate cũng cung ứng cthị trấn kia dễ dàng. Giả sử như bạn cần trả về số lượng những sản phẩm được order bởi vì một customer biết trước. Chúng ta sẽ viết một stored procedure nhằm thực hiện cthị trấn kia. Bên cạnh đó họ đang viết một value object HistoricalOrderSummary nhằm tàng trữ hiệu quả trả về của Stored Procedure. Chúng ta để ý là lớp này sẽ không inherite từ bỏ DomainObject cùng vị vậy không đề xuất một HBM đúng nghĩa tương xứng cùng với nó. Tuy nhiên chúng ta sẽ tạo ra một file HistoricalOrderSummary.hbm.xml với knhị báo trong đó thương hiệu của Stored Procedure đã thực hiện với công dụng đó maps thế nào. (Chi ngày tiết làm thế nào các tài liệu được maps cùng với tên miền objects sẽ tiến hành kể trong nội dung bài viết sau thời điểm họ bàn về công việc implement project EnterpriceSample.Data)
Code 7: Map hiệu quả trả về tự stored procedure vào XML- Đưa ra kỹ năng liên quan với stored procedure lại nảy sinh một sự việc thân quyết định vật gì cần được cách xử trí tính tân oán bằng stored procedure cùng vật gì đề nghị được tiến hành trong domain name layer. Ngoài stored procedure, C# code rất có thể lấy tất cả các order được customer đó đặt cài đặt, để ý qua các order kia với tính tổng những product. Nhưng cụ thể rằng nhằm Squốc lộ hệ thống triển khai cthị xã đó sẽ kết quả hơn các ví như nhỏng customer này sẽ mua hàng ngàn Order dẫn mang lại không hề ít biết tin được lưu lại vào database. Mặt không giống, đưa sử Lúc ta thử sử dụng một công tác analysis nào kia nhằm nhằm đo demo và thấy rằng tính toán bởi C# đã chạy lẹ rộng khi hotline Stored Procedure, thì dịp đó nên nhằm tên miền layer có tác dụng các bước xử lý nếu còn muốn. Nói tầm thường họ đề xuất dung hòa giữa hai chắt lọc này nhằm tối ưu hóa performance.III. Tóm tắtTrong phần một này họ đã trong thời điểm tạm thời gật đầu bài toán phải tạo các lớp Domain nhằm áp dụng cùng với NHibernate, bọn họ cũng hiểu được ngoại trừ bài toán tạo thành các lớp này còn cần viết thêm những file XML nhằm mapping chúng cùng với database. Tất cả các file này nên đặt trong cùng một project, có thể được đặt tên project là TênProject.Vi xử lý Core. Thêm nữa, những tệp tin XML nên là các embeded resource cùng đề xuất được viết theo convention của NHibernate. Trong phần tiếp sau chúng ta sẽ tò mò kĩ hơn bước khai báo các Interface được sử dụng trong layer Data.Code phần 1: http://londonrocknroll.comblog.googlepages.com/EnterpriseSample-part1.zipCác đoạn code minc họa trong bài viết được rút ít gọn cho dễ dàng nắm bắt, code được implement ở đầu cuối vào project sẽ có một trong những điểm khác biệt ví dụ như thêm constructor, thêm một số method, ...(Còn tiếp)

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *