2010-02-25 44 views
37

Tôi đang thiết kế một ứng dụng ASP.NET MVC bằng cách sử dụng Onion Architecture được mô tả bởi Jeffrey Palermo.Phụ thuộc vào kiến ​​trúc Onion trong cùng một lớp: Cơ sở hạ tầng và Web giao tiếp

Đây là dự án ASP.NET MVC 2.0, nơi tôi yêu cầu tất cả các chế độ xem được nhập mạnh mẽ bằng cách sử dụng Mô hình xem chuyên dụng - chúng tôi sẽ không chuyển mô hình miền cho chế độ xem của mình. Chúng tôi đang sử dụng AutoMapper để thực hiện việc dịch - AutoMapper bị cô lập trong cơ sở hạ tầng, Web không biết hoặc quan tâm rằng AutoMapper đang được sử dụng.

Hiện tại, tôi đang xác định giao diện IViewModelMapping trong dự án Web - đơn giản vì dịch vụ này sẽ được Bộ điều khiển sử dụng và nó có quyền truy cập trực tiếp vào Mô hình chế độ xem của riêng nó. Bằng cách này, giao diện có thể truy cập cả hai Mô hình Miền (trong Lõi) và Mô hình Xem (trong Web).

Để cung cấp việc triển khai thực tế các giao diện IViewModelMapping, tôi đã tạo một không gian tên ObjectMapping trong dự án Cơ sở hạ tầng, sẽ tách biệt việc thực hiện ánh xạ thực tế với Intrastructure của hành tây. Khi làm như vậy, điều này sẽ yêu cầu cơ sở hạ tầng để có sự phụ thuộc vào BOTH Core và Web.

Câu hỏi của tôi là: vì cả hai dự án này về mặt kỹ thuật ở ngoại ô của hành tây (trong cùng một lớp) - là một dự án được phép phụ thuộc vào một dự án khác trong lớp đó? Có ai nhận thấy bất kỳ cạm bẫy tiềm năng nào với thiết kế này không?

Một thiết kế thay thế sẽ di chuyển các giao diện IViewMapper vào Core - nhưng điều này là không thể vì Core không có quyền truy cập vào các lớp ViewModel. Tôi cũng có thể di chuyển các mô hình khung nhìn vào Core, nhưng tôi cảm thấy như chúng sẽ không thuộc về đó, vì chúng đặc trưng cho lớp UI.

Kiến trúc được đề xuất như sau - thông báo rằng Cơ sở hạ tầng có sự phụ thuộc vào Lõi và Web. Web vẫn bị cô lập và chỉ có quyền truy cập vào logic nghiệp vụ cốt lõi.

http://www.matthidinger.com/images/onion-arch.png

+2

Thiết kế cuối cùng bạn đã chọn và làm việc là gì? Thú vị để xem sơ đồ cập nhật với một số cấu trúc lớp cho Ánh xạ :) –

+0

Câu hỏi: Tại sao lớp Độ phân giải _Dependency_ có sự phụ thuộc vào _Web Layer_? Không nên _Controllers_ có một sự phụ thuộc vào _Dependency Resolution Layer_? – a11smiles

Trả lời

26

Bạn là chính xác mà bạn không muốn cơ sở hạ tầng phụ thuộc vào giao diện người dùng (Web), nhưng tôi phá vỡ quy tắc mà đôi khi.

Tôi sẽ nghĩ thay vì IViewModelMapping, tạo IMapper bằng phương thức Map(). Sau đó, giao diện có thể có các triển khai có thể phải làm với ánh xạ mô hình khung nhìn, hoặc có thể chỉ là ánh xạ thông thường. Dù bằng cách nào, giao diện đó có thể ở trong Core vì nó không bị ràng buộc về mặt ngữ nghĩa đối với bất kỳ kiểu mô hình nào.

Đồ họa tuyệt vời. Tôi hy vọng tôi đã trả lời câu hỏi của bạn. Triết lý tổng thể của Kiến trúc Hành động là giữ cho mô hình và mô hình kinh doanh của bạn ở giữa (Lõi) của ứng dụng của bạn và thúc đẩy sự phụ thuộc của bạn càng xa càng tốt.

+2

Cảm ơn Jeffrey. Bây giờ tôi sẽ xem xét lại thiết kế, nhưng có thể giữ nó theo cách nó là cho đến khi nó mang lại cho tôi bất kỳ đau đầu lớn. Điều quan trọng nhất đối với tôi là tôi không cam kết với bất kỳ quyết định nào mà tôi không thể đảo ngược sau :) –

+0

Bạn thật tuyệt vời !!! Thú vị để xem một số mã/cấu trúc proj :) –

0

Cố gắng di chuyển Ánh xạ đối tượng vào Lớp.

0

Lớp Web/UI của bạn có thể phụ thuộc vào lớp Cơ sở hạ tầng. Nhưng nó không phải là một thiết kế tốt để có sự phụ thuộc của Web trên tầng Cơ sở hạ tầng. Kiến trúc hành tây nói đẩy phụ thuộc của bạn càng xa càng tốt.

Bạn có thể tạo thư mục "\ Builder" trong giao diện người dùng. Thêm một tệp giao diện trong đó, ví dụ .. IBuilder hoặc IMapper và khai báo một phương thức như ConvertToViewModel hoặc CreateMapping trong đó. bất cứ điều gì bạn thích.

* Trình tạo ** IBuilder.cs -declare phương thức tại đây. ** Builder.cs - - Triển khai thực hiện phương thức ở đây, xác định ánh xạ giữa một ViewModel và DomainModel tương ứng của nó (tham chiếu từ lớp lõi) và trả về ViewModel thích hợp tại đây.

Các vấn đề liên quan