11

Nếu tôi có một lớp học với một ctor thiết lập cho tiêm-đa như thế này:Ninject đa tiêm không phải là tham lam như tôi đã có thể nghĩ! Làm thế nào mà?

public Shogun(IEnumerable<IWeapon> allWeapons) 
{ 
    this.allWeapons = allWeapons; 
} 

Và cam kết ràng buộc thiết lập như thế này:

Bind<IWeapon>().To<Sword>(); 
Bind<IWeapon>().To<Dagger>().WhenInjectedInto<Shogun>(); 

Sau đó, tôi mong chờ Shogun được xây dựng với cả hai vũ khí được tiêm? Nhưng đây không phải là trường hợp - nó chỉ nhận được Dagger.

Nếu tôi thêm một thêm ràng buộc như thế này:

Bind<IWeapon>().To<Sword>(); 
Bind<IWeapon>().To<Dagger>().WhenInjectedInto<Shogun>(); 
Bind<IWeapon>().To<Shuriken>().WhenInjectedInto<Shogun>(); 

Sau đó Shogun nhận được Dagger và Shuriken. WhenInjectedInto<T>() có vẻ như nó chỉ nên hạn chế ràng buộc nó được áp dụng và không ảnh hưởng đến các ràng buộc khác. Tôi thấy hành vi này rất gây hiểu lầm.

Ai đó có thể giải thích những gì đang xảy ra ở đây?

+0

Tôi xin lỗi, nhưng tại sao bạn mong chờ Shogun (trong trường hợp đầu tiên) được xây dựng với tất cả các loại vũ khí tiêm, khi bạn rõ ràng đang yêu cầu để ràng buộc IWeapon để Dagger, khi tiêm vào Shogun? – virtualmic

+0

Bởi vì tôi cũng đã yêu cầu 'IWeapon' bị ràng buộc với' Kiếm '. Tại sao nên ràng buộc 'IWeapon' thành' Dagger' trong trường hợp cụ thể ngăn chặn ràng buộc chung? Điều này có nghĩa là tôi có thể viết mã mà làm cho một ràng buộc cụ thể và phá vỡ các ràng buộc tổng quát hơn được thực hiện ở nơi khác. Có vẻ như nguy hiểm và phản trực giác. –

+1

Nhưng điều đó sẽ đánh bại mục đích của 'WhenInjectedInto', phải không? Tôi mới đến ninject, nhưng theo như tôi hiểu, mục đích của tính năng này là có trường hợp cụ thể, như bạn đã đề cập, xử lý. Bạn muốn 'IWeapon' bị ràng buộc với 'Kiếm' nói chung; tuy nhiên, khi được tiêm vào 'Shogun', bạn muốn nó bị ràng buộc với' Dagger'. Nếu bạn muốn 'Shogun' có cả hai' Sword' và 'Dagger' được tiêm,' WhenInjectedInto' không nên được sử dụng, IMHO. – virtualmic

Trả lời

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