2013-04-27 22 views
5

Tôi có đoạn code sau trong Simple Injector IoC container:Ninject tương đương cho phương pháp SimpleInjector RegisterDecorator

container.RegisterDecorator(typeof(ICommandHandler<>), 
    typeof(ValidationCommandHandlerDecorator<>)); 

tôi cần phải dịch này để Ninject tương đương. Tôi đã đọc rằng mô hình trang trí trong Ninject được thực hiện thông qua phương pháp WhenInjectedInto, nhưng toàn bộ đấu thầu đòi hỏi như 3 thông số như ở đây:

Bind<IRepository>().To<SimpleRepository> 
    .WhenInjectedInto<AdvancedRespository>(); 

phương pháp trong Injector đơn giản này chỉ 2 mất, vì vậy bạn có thể cho tôi biết xin vui lòng những gì tôi đang thiếu ở đây?

Trả lời

2

Tôi nghĩ rằng không có tương đương trực tiếp với chức năng RegisterDecorator của SimpleInjector. Nếu tôi hiểu nó đúng, điều này định nghĩa rằng bất cứ khi nào bạn yêu cầu một ICommandHandler, bạn sẽ nhận được một ValidationCommandHandlerDecorator trả lại rằng trang trí một số ICommandHandler mặc định. Trong Ninject bạn cần phải làm điều này như bạn đã làm. Ít nhất tôi không biết về bất kỳ chức năng hoặc phần mở rộng nào cung cấp trực tiếp cơ chế đó.

cũng Xem câu hỏi này How the binding are done with decorators using Ninject?

1

Sau khi đọc về trang trí trong Injector đơn giản, tôi không thực sự nhìn thấy nó như thế nào là bất kỳ khác biệt so với một mũi tiêm bình thường. Tại sao bạn không thể làm điều này?

kernel.Bind(typeof(ICommandHandler<>))() 
     .To(typeof(ValidationCommandHandlerDecorator<>)) 

Nếu bạn cần phải kiểm soát rằng một số dạng tiêm dựa vào loại đối tượng, sau đó bạn sẽ sử dụng .WhenInjectedInto()

+3

Sự khác biệt giữa giữa ứng dụng trang trí với Injector Simple vs hầu hết các loại hộp đựng khác, đó là trang trí in Simple Injector không được đăng ký nhưng trở thành một phần của một đăng ký hiện tại (họ thay đổi/chặn đăng ký thực). Trong hầu hết các trường hợp, sự khác biệt này không liên quan, nhưng làm cho các tình huống nhất định dễ dàng hơn đáng kể. Những người dùng Injector đơn giản thường áp dụng các trang trí theo điều kiện (dựa trên một số ràng buộc hoặc vị từ kiểu chung). Đây là điều thường khó làm hơn với các khung công tác khác. Nó thường không phải là không thể, nhưng đơn giản là không sạch sẽ. – Steven

+0

@Steven - Ninject cung cấp chức năng đánh chặn là tốt, và bạn có thể sử dụng một kiểu hoặc vị từ để kiểm soát những gì được tiêm vào cái gì (sử dụng '.When()' cho một vị từ). Tôi vẫn không hiểu sự khác biệt ở đây, và cụm từ "không đăng ký bản thân nhưng trở thành một phần của một đăng ký hiện tại" có vẻ vô nghĩa. Tại sao bạn sẽ đăng ký một điều nếu bạn định đăng ký một thứ khác? Chỉ cần thay đổi đăng ký của bạn, đó là toàn bộ quan điểm của việc đăng ký một cấu hình. –

+4

Chức năng đánh chặn chức năng của Ninject giống như khả năng trang trí của Simple Injector, nhưng đánh chặn! = Trang trí. Một sự khác biệt là trang trí là sạch hơn so với interceptors, ví dụ bởi vì họ có thể được viết theo một cách bất khả tri khung, trong khi một interceptor có để thực hiện một giao diện cụ thể (khuôn khổ cụ thể). Sự khác biệt có vẻ không đáng kể đối với bạn, nhưng không phải tất cả các nhà phát triển đều cảm thấy như vậy. Đó là lý do tại sao Simple Injector tập trung vào trang trí thay vì đánh chặn. – Steven

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