Nếu tôi không sử dụng vùng chứa DI, tôi sẽ không phải tham chiếu thư viện EntityFramework trong ứng dụng MVC3 của mình
Ngay cả khi sử dụng DI container, bạn không phải để dự án MVC3 của mình tham chiếu EF, nhưng bạn (mặc nhiên) chọn làm điều này bằng cách triển khai Gốc cấu phần (đường dẫn khởi động nơi bạn soạn đồ thị đối tượng) bên trong dự án MVC3 của mình. Nếu bạn rất nghiêm khắc về việc bảo vệ ranh giới kiến trúc của mình bằng cách sử dụng các cụm, bạn có thể chuyển logic bản trình bày của mình sang một dự án khác.
Khi bạn di chuyển tất cả logic liên quan đến MVC (bộ điều khiển, v.v.) từ dự án khởi động sang thư viện lớp, nó cho phép tổ hợp lớp bản trình bày này không bị ngắt kết nối với phần còn lại của ứng dụng. Bản thân dự án ứng dụng web của bạn sẽ trở thành một lớp vỏ rất mỏng với logic khởi động bắt buộc. Dự án ứng dụng web sẽ là Gốc thành phần tham chiếu đến tất cả các hợp ngữ khác.
Trích xuất logic bản trình bày vào thư viện lớp có thể làm phức tạp mọi thứ khi làm việc với MVC. Sẽ khó hơn để kết nối mọi thứ, vì bộ điều khiển không nằm trong dự án khởi động (trong khi các chế độ xem, hình ảnh, tệp css, có thể phải ở trong dự án khởi động). Điều này có thể làm được nhưng sẽ mất nhiều thời gian hơn để thiết lập.
Vì những nhược điểm, tôi thường khuyên bạn chỉ nên giữ Gốc thành phần trong dự án web. Nhiều nhà phát triển không muốn lắp ráp MVC của họ phụ thuộc vào lắp ráp DAL, nhưng đó không thực sự là vấn đề. Đừng quên rằng các tập hợp là một tạo tác triển khai ; bạn chia mã thành nhiều tập hợp để cho phép mã được triển khai riêng biệt. Mặt khác, một lớp kiến trúc là một tác phẩm hợp lý . Rất có thể (và phổ biến) có nhiều lớp trong cùng một tổ hợp.
Trong trường hợp này, chúng ta sẽ có Gốc Thành phần (lớp) và Lớp Trình bày trong cùng một dự án ứng dụng web (do đó trong cùng một hội đồng). Và mặc dù hợp ngữ đó tham chiếu đến hợp ngữ chứa DAL, Lớp trình bày vẫn không tham chiếu Lớp truy cập dữ liệu . Đây là một sự khác biệt lớn.
Tất nhiên, khi chúng tôi làm điều này, chúng tôi sẽ mất khả năng trình biên dịch kiểm tra quy tắc kiến trúc này tại thời điểm biên dịch, nhưng đây không phải là vấn đề. Hầu hết các quy tắc kiến trúc thực sự không thể được trình biên dịch kiểm tra và luôn có một cái gì đó giống như lẽ thường. Và nếu không có ý thức chung trong nhóm của bạn, bạn luôn có thể sử dụng đánh giá mã (mà mọi đội IMO luôn nên làm btw). Bạn cũng có thể sử dụng một công cụ như NDepend (thương mại), giúp bạn xác minh các quy tắc kiến trúc của mình. Khi bạn tích hợp NDepend với quy trình xây dựng của mình, nó có thể cảnh báo bạn khi ai đó kiểm tra mã vi phạm quy tắc kiến trúc đó.
Bạn có thể đọc một cuộc thảo luận chi tiết hơn về cách hoạt động của Gốc Thành phần trong chương 4 của cuốn sách Tiêm phụ thuộc, Nguyên tắc, Thực hành, Mẫu của tôi .