5

Tôi đang cố gắng để bắt đầu một dự án mới (asp.net MVC) và tôi muốn áp dụng một số quy tắc DDD mà tôi đã học được trong vài tháng qua.
Tôi không biết cách tổ chức giải pháp của mình.
Tôi muốn sử dụng Nhibernate nhưng tôi không muốn sử dụng Fluent Nhibernate vì nó phải giống như một thử nghiệm.
Tôi đã xem một số ví dụ trong đó mọi người giữ mọi thứ trong cùng một dự án. Một số người khác có xu hướng tạo ra một dự án khác cho mọi thứ. Bạn có nghĩ rằng tôi nên phân biệt mô hình và kho lưu trữ hoặc đặt nó trong cùng một dự án?
Nếu ai đó có một số liên kết đến bài viết, v.v. nó sẽ được đánh giá cao.
Làm thế nào để tổ chức một giải pháp ASP.NET MVC (DDD)

nhờ

Alberto

+0

Không phải mọi dự án với asp.net mvc, ddd và nhibernate sẽ phù hợp với một số kiến ​​trúc "mặc định". Vì vậy, cách tổ chức dự án phụ thuộc vào những gì dự án của bạn làm. Chỉ có một điều tôi làm cho mọi ứng dụng: tôi đặt logic trình bày (asp.net mvc trong trường hợp này) trong một dự án riêng biệt từ logic nghiệp vụ (ddd? Trong trường hợp này). Bạn muốn tạo loại ứng dụng web nào và bạn muốn sử dụng ddd trong ứng dụng này như thế nào? – Paco

Trả lời

4

Cá nhân tôi nghĩ rằng việc chia từng lớp thành một dự án riêng biệt là một ý tưởng tốt hơn. Có một số điều mà bạn không thể đạt được với việc có 1 dự án ASP.NET MVC lớn bao gồm tất cả các lớp của bạn.

Ví dụ: giả sử bạn có một lớp Sản phẩmProductFactory. Bạn muốn thực thi việc tạo một đối tượng Sản phẩm được thực hiện thông qua ProductFactory. Để đạt được điều này, bạn có thể tạo hàm tạo của Sản phẩm lớp nội bộ.Bằng cách này, ProductFactory lớp thể nhanh chóng một lớp sản phẩm vì sản phẩmProductFactory là trong cùng một assembly. Tuy nhiên, nếu bạn cố gắng tạo lớp học Sản phẩm từ một dự án khác (ví dụ: dự án ASP.NET MVC của bạn), bạn sẽ nhận được lỗi biên dịch. Bằng cách này bạn có thể đạt được một đóng gói tốt hơn.

Lưu ý rằng nếu sản phẩm, ProductFactorycủa bạn điều khiển là trong cùng một dự án, bạn vẫn có thể xem các sản phẩm 's constructor trong khiển của bạn. Vì vậy, một nhà phát triển nghiệp dư không hiểu các quyết định kiến ​​trúc đằng sau thiết kế của bạn và chỉ có thể bỏ qua các sản phẩm ProductFactory và tạo một đối tượng Sản phẩm trực tiếp.

Ngoài ra, việc có một dự án riêng biệt cho mỗi lớp giúp bảo trì của bạn dễ dàng hơn vì bạn phải đối phó với các dự án nhỏ hơn, trái ngược với 1 dự án lớn.

+0

Cảm ơn Mosh. Câu trả lời hay nhất ... một cái gì đó dễ hiểu :-) – LeftyX

5

Jimmy Bogard (tác giả của Automapper) đã viết một tuyệt vời article về cách ông cấu trúc mã của mình, có thể hỗ trợ trong việc giúp đỡ quyết định của bạn.

Tôi đã làm việc với các dự án có hàng triệu cụm và dự án riêng biệt có số lượng nhỏ. Sở thích cá nhân của tôi là có ít hội đồng hơn vì tôi luôn thấy dễ dàng hơn khi làm việc cùng. Nếu bạn sử dụng các nguyên tắc mã hóa tốt (như SOLID) thì nó sẽ không thành vấn đề nếu bạn sử dụng 2 hoặc 20 assembly.

2

Nó phụ thuộc vào dự án của bạn lớn như thế nào, nhưng tôi sẽ đi cho các dự án khác nhau cho mô hình và kho lưu trữ. Theo ý kiến ​​của tôi, nó không thích hợp để giữ cho các công cụ của mô hình của bạn trong thư mục mô hình của dự án WEB Mvc. Nó quá đông đúc ở đó :)

Điều quan trọng trong DDD là không giới thiệu các yếu tố công nghệ cụ thể trong logic miền của bạn (như NHibernate bạn dự định sử dụng hoặc bất kỳ ORM nào khác). Điều này thường là tạo ra lớp chống tham nhũng được gọi là.

Ngoài mẫu kho lưu trữ, hãy xem xét sử dụng mẫu đặc tả để lọc dữ liệu đến từ kho lưu trữ.

0

MVC2 có khái niệm về các khu vực tạo ra sự quan tâm riêng biệt. Tôi vẫn không thích cách nó được thực hiện. Tôi tạo ra một dự án riêng biệt cho hầu hết mọi bộ điều khiển. Bằng cách đó tôi có thể trộn và kết hợp các bộ điều khiển trong các dự án mới mà tôi làm việc. Ví dụ tuyệt vời là tôi có một dự án được gọi là "Bảo mật" xử lý tất cả nội dung đăng nhập và quản lý người dùng. Một dự án khác mà tôi có được gọi là Thông báo xử lý tất cả các tin nhắn và email. Những gì tôi làm để kéo chúng lại với nhau là tôi tạo một dự án cốt lõi cho bất kỳ dự án nào tôi đang làm, và sau đó tôi nhập vào dll từ dự án khác và tất cả những gì tôi phải đảm bảo là tôi có các khung nhìn và javascript tại chỗ và nó sẽ công việc.