2010-01-20 28 views
14

Tôi có phương thức nhà máy bên trong trình phân tích cú pháp. Về cơ bản khi tôi tải một mã thông báo, tôi tìm trình xử lý cho mã thông báo đó hoặc chuyển qua trình xử lý mặc định. Tôi đã thực hiện điều này như là một switch và như là một Dictionary<string,Type> nhưng cả hai phương pháp tiếp cận yêu cầu tôi để lưu trữ các bản đồ ở một nơi khác hơn là lớp xử lý.Sử dụng Ninject IOC để thay thế một nhà máy

Chúng tôi đang sử dụng Ninject cho IOC và vì vậy tôi đã nhận ra rằng mình cũng có thể làm điều đó bằng

kernel.Get<ITokenHandler>(tokenName); 

nhưng điều đó không cứu tôi lưu trữ các thông tin về những mã thông báo xử lý có thể đối phó với tại 2 địa điểm . Có cách nào tôi có thể trang trí xử lý để điều này được ánh xạ tự động?

Trả lời

11

Nếu tôi làm theo câu hỏi của bạn một cách chính xác, có vẻ như bạn muốn truy xuất liên kết được đặt tên. Bạn đã không đề cập đến phiên bản nào của Ninject bạn đang sử dụng, nhưng dựa trên đoạn mã của bạn, tôi đoán bạn đang sử dụng Ninject 2.0. Nếu đó là trường hợp sau đó tôi sẽ nghĩ rằng đây sẽ là đủ để gắn kết của bạn trong module của bạn:

Bind<ITokenHandler>().To<YourConcreteTypeHere>().Named(tokenName); 

Bạn ràng buộc như nhiều loại cụ thể để cùng một giao diện và phân biệt chúng bằng tên, và sau đó lấy chúng bằng cách sử dụng cú pháp chính xác bạn đã được chỉ định trong câu hỏi của bạn.

Nếu tôi thiếu khóa nào đó, hãy cho tôi biết.

+0

Một chút muộn để trở lại đây. Những gì tôi đã thực sự sau đó là một cách để đánh dấu các lớp bê tông ITokenHandler để tôi có thể xác định các ràng buộc mà Handler đã được tuyên bố. Bây giờ tôi đã đi với ví dụ của bạn là tất cả các thanh 1 của các ràng buộc là của mô hình: Ràng buộc (). >(). Đặt tên (tokenName); – baralong

1

Một kỹ thuật tôi đã sử dụng là công cụ Bind theo cách sao cho bạn có thể yêu cầu cung cấp thông số (trong ngữ cảnh) tại thời điểm bạn muốn người nào đó chọn thứ gì đó.

Giữa http://ninject.codeplex.com/wikipage?title=Providers%20and%20the%20Activation%20Contexthttp://ninject.codeplex.com/wikipage?title=Contextual%20Binding bạn sẽ có thể Ràng buộc mọi thứ theo cách mà bạn có thể nói Only(When.Context...) để làm cho lựa chọn hoạt động?

+0

Chỉ nhìn thấy câu trả lời khác (như đã +1 trên điều này). Câu trả lời khác trông giống như một cách tiếp cận rõ ràng hơn và rõ ràng vì vậy tôi chắc chắn sẽ thích nó nếu có thể - cách tiếp cận của tôi là một cách tiếp cận tổng quát hơn khi được xây dựng theo cách không thể. –

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