Tôi nghĩ tiền đề của bạn có một chút nhầm lẫn ở đây, bạn nói về việc tiêm một nhà máy, nhưng mô hình nhà máy là một mô hình sáng tạo với mục đích là làm một tập hợp con của khung công tác phụ thuộc, khi các khung DI không phổ biến mô hình này hữu ích cho lý do đó. Tuy nhiên, nếu bạn có khung DI, bạn không còn thực sự cần một nhà máy nữa vì khung DI có thể hoàn thành mục đích mà nhà máy sẽ hoàn thành.
Điều đó nói rằng, hãy để tôi giải thích một chút về tiêm phụ thuộc và cách bạn thường sử dụng nó.
Có nhiều cách khác nhau để thực hiện tiêm phụ thuộc, nhưng phổ biến nhất là tiêm xây dựng, tiêm tài sản và DIContainer trực tiếp. Tôi sẽ nói về việc tiêm nhà xây dựng vì việc tiêm tài sản là cách tiếp cận sai trong hầu hết thời gian (cách tiếp cận đúng thời gian) và không nên truy cập DIContainer trừ khi bạn hoàn toàn không thể thực hiện một trong hai cách tiếp cận khác.
Trình xây dựng tiêm là nơi bạn có giao diện cho một phụ thuộc và DIContainer (hoặc nhà máy) biết triển khai cụ thể cho phụ thuộc đó và bất cứ khi nào bạn cần một đối tượng phụ thuộc vào giao diện đó, tại thời điểm xây dựng bạn giao việc triển khai từ nhà máy để nó
I E
IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();
Nhiều khung DI có thể đơn giản hóa điều này một cách đáng kể đến nơi DIContainer của bạn sẽ kiểm tra hàm tạo của UserRep repository để biết các giao diện mà nó biết triển khai cụ thể và sẽ tự động trao chúng cho bạn; kỹ thuật này thường được gọi là Inversion of Control, mặc dù DI và IoC đều là hai thuật ngữ được thay thế cho nhau rất nhiều và có sự khác biệt mơ hồ (nếu có).
Bây giờ nếu bạn đang tự hỏi làm thế nào mã bao trùm truy cập vào DIContainer, thì bạn cũng có thể có một lớp tĩnh để truy cập nó hoặc điều thích hợp hơn là hầu hết các khung DI cho phép bạn tạo một DIContainer mới, trong đó nó thực sự sẽ hoạt động như một trình bao bọc cho một từ điển singleton nội bộ cho các loại mà nó biết là cụ thể cho các giao diện nhất định.
Điều đó có nghĩa là, bạn có thể cập nhật DIContainer bất cứ nơi nào bạn muốn trong mã và nhận được cùng một DIContainer mà bạn đã cấu hình để biết các mối quan hệ giao diện cụ thể của mình. Các phương tiện thông thường để ẩn DIContainer khỏi các phần của mã không nên tương tác trực tiếp với nó là chỉ đơn giản là đảm bảo chỉ (các) dự án cần thiết có tham chiếu đến khung DI.