2008-10-01 16 views
5

Tôi là một chút của một newbie DI, vì vậy tha thứ cho tôi nếu đây là cách tiếp cận sai hoặc một câu hỏi ngớ ngẩn.Tôi nên đặt các tham số ctor của mình cho DI/IOC như thế nào?

Giả sử tôi có biểu mẫu tạo/cập nhật đơn đặt hàng và tôi biết rằng cần phải truy xuất danh sách sản phẩm và khách hàng để hiển thị. Tôi muốn truyền vào đối tượng Order mà nó đang chỉnh sửa, nhưng tôi cũng muốn đưa ProductService và CustomerService làm phụ thuộc.

Vì vậy, tôi sẽ muốn container IoC của tôi (tùy theo cái nào tôi đi cùng) để cung cấp dịch vụ, nhưng nó sẽ tùy thuộc vào mã gọi để cung cấp đối tượng Order để chỉnh sửa.

Tôi có nên khai báo constructor như chụp các đối tượng theo thứ tự như tham số đầu tiên và ProductsService và CustomersService sau đó, ví dụ:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

... hoặc các phụ thuộc nên đến đầu tiên và đối tượng theo thứ tự cuối cùng, ví dụ:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

Có sao không? Liệu nó phụ thuộc vào container IoC tôi sử dụng? Đây có phải là cách tốt hơn không?

Trả lời

4

Tôi không đồng ý với câu trả lời của @ aku.

Tôi nghĩ rằng những gì bạn đang làm là tốt và cũng có những cách khác để làm điều đó không có nhiều hay ít đúng. Ví dụ, người ta có thể đặt câu hỏi liệu đối tượng này có nên phụ thuộc vào các dịch vụ ở nơi đầu tiên hay không.

Bất kể DI, tôi cảm thấy rất hữu ích khi làm rõ trong tâm trí của bạn ít nhất là loại trạng thái mà mỗi đối tượng nắm giữ, chẳng hạn như trạng thái thực (Order), trạng thái bắt nguồn (nếu có) và phụ thuộc (dịch vụ):

http://tech.puredanger.com/2007/09/18/spelunking/

Trên bất kỳ constructor hoặc phương pháp, tôi thích các dữ liệu thực tế được thông qua đầu tiên và phụ thuộc hoặc các công cụ bên ngoài để được thông qua cuối cùng. Vì vậy, trong ví dụ của bạn tôi muốn đầu tiên.

5

Matt, bạn không nên kết hợp các thông số bình thường với phụ thuộc. Kể từ khi đối tượng của bạn sẽ được tạo ra trong nội bộ của container IoC, làm thế nào bạn sẽ xác định các đối số cần thiết?

Trộn phụ thuộc và đối số bình thường sẽ làm cho logic của chương trình của bạn phức tạp hơn.

Trong trường hợp này nó sẽ là tốt hơn để khai báo các thuộc tính phụ thuộc (ví dụ: loại bỏ sự phụ thuộc từ constructor) hoặc khởi trật tự lĩnh vực sau IoC xây dựng OrderForm và giải quyết nó phụ thuộc (ví dụ: loại bỏ các thông số bình thường từ constructor).

Ngoài ra, bạn có thể khai báo tất cả các thông số của mình, bao gồm đặt hàng làm phụ thuộc.

+0

Ok, điều này có ý nghĩa. Vì vậy, hoặc là tôi sử dụng tiêm tài sản cho tất cả các phụ thuộc của tôi, hoặc CHỈ vượt qua phụ thuộc vào ctor và giới thiệu một tài sản cho các "cần thiết" đối tượng? –

+0

Vâng, bạn nói đúng. Đừng trộn DP và các thuộc tính bình thường vì nó có thể dẫn đến các vấn đề không được dự đoán và giới hạn phạm vi của các khung công tác IoC phù hợp. – aku

3

Tôi cảm thấy hơi lo lắng về việc cho phép một phiên bản OrderForm được khởi tạo mà không cần tham chiếu đến một cá thể Order. Một lý do có thể là điều này sẽ ngăn cản tôi thực hiện kiểm tra trả trước cho các đơn đặt hàng không hợp lệ. Còn suy nghĩ nào nữa không?

Tôi cho rằng tôi có thể thoải mái khi biết rằng các đối tượng OrderForm sẽ chỉ được khởi tạo bởi phương thức Factory để đảm bảo thuộc tính Order được đặt sau khi thực hiện cuộc gọi đến khung công tác IoC.

+0

Trong câu trả lời của tôi, tôi đã đề xuất một số cách tiếp cận bao gồm một phương pháp với tham số ** thứ tự ** bắt buộc. Tuy nhiên, câu hỏi là về trộn DP và tính chất bình thường. Câu trả lời của tôi là - đừng trộn lẫn. Tôi rất vui khi được nghe những lời chỉ trích mang tính xây dựng. – aku