2012-01-08 18 views
28

Trong Ninject3 có .ToConstructor feature mới.Sự khác biệt giữa. ToConstructor và .ToMethod trong Ninject 3 là gì?

Như đã trình bày, nó giúp để mạnh mẽ kiểu đối số nhà xây dựng như:

Bind<IMyService>().ToConstructor(
    ctorArg => new MyService(ctorArg.Inject<IFoo>(), ctorArg.Inject<IBar>())); 

gì thực sự khác biệt giữa việc sử dụng .ToConstructor.ToMethod trong một gần như cùng một cách:

Bind<IMyService>().ToMethod(
    x => new MyService(x.Kernel.Get<IFoo>(), x.Kernel.Get<IBar>())); 

Chỉ là đường cú pháp để tránh sử dụng Kernel.Get <>() hoặc có som ething nhiều hơn tôi đang mất tích?

+0

Lưu ý: 'Nhận ' là một phương thức mở rộng và bạn phải dùng 'using Ninject;' để nó hoạt động. Tôi mất một phút vì tôi đã tránh xa 'bằng cách sử dụng Ninject.Modulesl' cho đến bây giờ) –

Trả lời

26

Trường hợp đầu tiên hoạt động như To<MyService>() ngoại trừ việc bạn chọn rõ ràng hàm tạo. Điều này có nghĩa là ngữ cảnh được chuyển qua MyService và bạn có thể sử dụng các điều kiện cho IFooIBar hoặc một trong các phụ thuộc của chúng trong trường hợp thứ hai bạn nhận được ngữ cảnh mới cho IFooIBar và bạn sẽ không biết rằng chúng được tiêm vào MyService.

ví dụ:

Bind<IFoo>().To<FooA>().WhenInjectedInto<MyService>(); 
Bind<IFoo>().To<FooB>().WhenInjectedInto<MyOtherService>(); 

sẽ không hoạt động trong trường hợp thứ hai.

+0

Chọn hàm tạo hữu ích nếu có hai tên có cùng tên tham số và các loại khác nhau, trong trường hợp đó, Ninject sẽ ném một ngoại lệ. ví dụ. 'Foo (int x)' và 'Foo (chuỗi x)' – ashes999

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