2011-01-13 23 views
6

Tôi mới làm quen với IoC và DI này. Tôi cảm thấy mình có khái niệm nếu bạn truyền đi các đối tượng có phạm vi toàn cầu, nhưng tôi không nhận được cách nó hoạt động khi bạn cần truyền xung quanh một đối tượng có trạng thái logic cụ thể. Vì vậy, ví dụ, nếu tôi muốn tiêm một đối tượng người vào một đối tượng lệnh ghi tập tin-làm thế nào tôi có thể chọn đối tượng người đúng động? Từ những gì tôi đã thấy, tôi có thể mặc định xây dựng đối tượng, nhưng ngắt kết nối của tôi là bạn sẽ không sử dụng một đối tượng người mặc định, nó sẽ cần phải năng động. Tôi giả định rằng container IoC chỉ có thể duy trì trạng thái của đối tượng cho bạn khi nó được truyền xung quanh, nhưng sau đó giả định rằng bạn đang xử lý chỉ một đối tượng người vì sẽ không có an toàn luồng, phải không? Tôi biết tôi đang thiếu một cái gì đó, (có thể một cái gì đó giống như một factoryclass), nhưng tôi cần thêm một chút thông tin về cách thức đó sẽ làm việc.IoC Dependency Injection cho các đối tượng stateful (không phải toàn cầu)

Trả lời

6

Vâng, bạn luôn có thể tiêm Abstract Factory vào người tiêu dùng của mình và sử dụng nó để tạo các đối tượng có phạm vi cục bộ.

Điều này đôi khi cần thiết. Xem các ví dụ:

Tuy nhiên, nói chung chúng ta có xu hướng không sử dụng DI cho các thực thể, nhưng chủ yếu là cho các dịch vụ. Thay vào đó, các thực thể thường được tạo thông qua một số loại Kho lưu trữ.

+0

Vì vậy, nói chung, các thực thể sẽ không phải là một phần của cơ sở hạ tầng DI? Tôi có quá phức tạp không? – mytwocents

+1

Đúng vậy: Thực thể và đối tượng giá trị có khuynh hướng sống một cuộc sống riêng biệt. Theo một nghĩa nào đó, chúng vẫn được quản lý bởi cơ sở hạ tầng DI (lý tưởng là mọi thứ), nhưng theo cách rất gián tiếp. Chúng thường được đọc và ghi vào bộ nhớ vĩnh viễn thông qua Kho lưu trữ hoặc những thứ tương tự và * những người đó là các Dịch vụ là một phần của cơ sở hạ tầng DI. –

+0

Ok, tôi nghĩ rằng DI chính đã nói rằng đối tượng Enitity người nên được làm sẵn từ container IoC (thông qua cấu hình) ... – mytwocents

4

Khi bạn xây dựng một đối tượng dịch vụ (ví dụ: WriteFileService), bạn tiêm vào những thứ cần thiết trong nội bộ để hoàn thành công việc của mình. Có lẽ nó cần một đối tượng hệ thống tập tin hoặc một cái gì đó.

Đối tượng Person trong ví dụ của bạn phải được chuyển cho đối tượng dịch vụ dưới dạng tham số cho cuộc gọi phương thức. ví dụ. writeFileService.write(person)

+0

Vì vậy, bạn sẽ không tiêm WriteFileService vào đối tượng Entity person ... vì vậy trong trường hợp này, tôi có thể thấy cách thực thể có thể được sử dụng mà không có cơ sở hạ tầng DI. Mặc dù, WriteFileService có thể sử dụng cơ sở hạ tầng DI khi nó được tạo ra (dựa trên nhu cầu cho một lớp được tiêm vào một đầu ra cụ thể, ví dụ:WriterA - ghi vào cơ sở dữ liệu, WriterB - quyền đối với bàn điều khiển, v.v ...). – mytwocents

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