2015-10-11 27 views
6

Say, rằng tôi có cấu trúc dự án sau:phụ thuộc tiêm vs lắp ráp phụ thuộc nào

Application <-> BusinessLogic <-> DataAccessLayer 

tôi đã chuẩn bị tất cả các loại sử dụng kém man's-phụ thuộc-tiêm và bây giờ tôi muốn giới thiệu một trong những thực sử dụng Unity. Nhưng tôi đang đấu tranh về nơi để đặt container phụ thuộc và cấu hình của nó (tôi cho rằng tôi sẽ cấu hình nó từ mã).

  • DataAccessLayer cần phải đăng ký Context (EF)
  • BusinessLogic nhu cầu đăng ký các kho dữ liệu (mà sử dụng ngữ cảnh)
  • Application cần đăng ký dịch vụ (mà sử dụng kho)

Hiện tại, hội đồng duy nhất sử dụng vùng chứa để thực sự khởi tạo các lớp sẽ là Ứng dụng. Vì vậy, tôi có sơ đồ phụ thuộc sau:

  • DI sử dụng DataAccessLayer
  • DI sử dụng được BusinessLogic
  • DI sử dụng Application
  • Application sử dụng DI

Tôi có tham chiếu vòng tròn ở đây, vì vậy nó có vẻ hợp pháp để đưa DI bên Application. Nhưng sau đó tôi phải tham khảo DataAccessLayer và đó là sự phụ thuộc mà tôi không muốn tạo. Tôi nên giải quyết vấn đề này như thế nào?

+0

"DI" không được phụ thuộc vào bất kỳ điều nào trong số này. Tùy thuộc vào máy khách ('Ứng dụng' trong trường hợp của bạn) để đăng ký các phụ thuộc * bằng cách sử dụng * DI. – haim770

+0

@ haim770 Bằng cách "DI sử dụng *", tôi có nghĩa là: "Ai đó, người đăng ký các loại từ * phải có quyền truy cập vào nó". Nếu tôi đăng ký các loại từ 'Application', tôi phải tạo một phụ thuộc vào' DataAccessLayer', nhưng tôi không muốn làm điều đó (nếu có thể, ít nhất). – Spook

+0

Ngay cả khi bạn đang ủy nhiệm đăng ký cho dự án DI, bạn không thực sự đạt được bất cứ điều gì như là cuối cùng ứng dụng * là * phụ thuộc vào những hội đồng và họ * sẽ * được tham chiếu. Có lẽ những gì bạn đang thực sự sau khi đăng ký năng động bằng cách sử dụng Assembly Scanning (http://autoregistration.codeplex.com/)? – haim770

Trả lời

1
  1. Trong lớp DL tạo phương thức để đăng ký thành phần của nó.
  2. Trong lớp BL làm tương tự nhưng cũng gọi phương thức DL.
  3. Trong lớp A cũng làm như vậy nhưng cũng gọi phương thức BL.

Bằng cách đó lớp tương đối trên được che chắn từ các lớp thấp hơn và mọi thứ đều được đăng ký đúng cách. Đối với lớp A nó là một chi tiết thực hiện mà DL thậm chí còn tồn tại. Nó chỉ biết về lớp BL.

3

Nếu bạn muốn sử dụng vùng chứa DI, thì bạn chỉ nên sử dụng nó trong ứng dụng, chứ không phải trong thư viện lớp khác của bạn (ví dụ: BusinessLogic và DataAccessLayer). Vị trí trong Đơn mà bạn soạn biểu đồ đối tượng của mình được gọi là Composition Root.

Trích dẫn cho bài viết đó:

Chỉ ứng dụng nên có Roots phần. Các thư viện và khung công tác không nên.

Vì bạn đã chuẩn bị các lớp học để giúp người đàn ông nghèo DI (bây giờ gọi là Pure DI), bạn nên ổn. DI hiện đã được kích hoạt trong thư viện của bạn (Xin lưu ý rằng các thùng DI và DI là những thứ khác nhau).

Giờ đây, ứng dụng của bạn có thể kết nối tất cả mọi thứ với nhau từ tất cả các thư viện lớp, ngay cả khi điều đó có nghĩa là dự án ứng dụng của bạn cần phải tham khảo tất cả các thư viện lớp khác.

Theo ý kiến ​​của tôi, bạn sẽ tốt hơn nếu không có vùng chứa DI (ngay cả trong lớp ứng dụng), xem this article vì lý do tại sao.

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