2010-09-09 30 views
8

Tôi có một tình huống mà tôi muốn phụ thuộc tiêm đối tượng người dùng của tôi, nhưng cũng đặt người dùng hiện tại trong thùng chứa IoC. Tôi muốn các dòng sau vào làm việc:Trong Ninject 2.0, làm thế nào để tôi có cả một ràng buộc chung và một ràng buộc cho một trường hợp specfic?

kernel.Get<User>(); // Should return a new User() 
kernel.Get<User>("Current"); // Should return the current user 

Người ta có thể nghĩ rằng các ràng buộc như thế này sẽ làm việc:

Bind<User>().ToSelf(); 
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current"); 

Tất nhiên, cung cấp cho:

Ninject.ActivationException: Error activating User 
More than one matching bindings are available. 
Activation path: 
1) Request for User 

Suggestions: 
1) Ensure that you have defined a binding for User only once.

Tôi hiểu lỗi từ một Đặt tên ràng buộc không hạn chế việc áp dụng ràng buộc đó, do đó, cả hai ràng buộc áp dụng. Có vẻ như rõ ràng rằng tôi cần phải sử dụng ràng buộc theo ngữ cảnh với các phương thức .When *() nhưng tôi không thể nghĩ ra cách nào để làm điều đó. Tôi cảm thấy như cần có khi phương pháp phát hiện liệu một trường hợp được đặt tên có được áp dụng hay không. Một cái gì đó như:

// Not valid Ninject syntax 
Bind<User>().ToSelf().WhenUnnamedRequested(); 
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current"); 

Tôi không thể tìm thấy bất kỳ địa điểm nào trên giao diện IRequest hoặc thuộc tính của nó cho tôi biết tên được yêu cầu. Làm thế nào để tôi làm điều này?

Trả lời

3

Câu hỏi này được thưa: trên mailing list: http://groups.google.com/group/ninject/browse_thread/thread/cd95847dc4dcfc9d?hl=en


Nếu bạn đang truy cập người dùng bằng cách gọi Nhận về hạt nhân (mà tôi hy vọng bạn không) sau đó cung cấp cho các đầu tiên ràng buộc một tên như tốt và truy cập Người dùng luôn theo tên. Trên thực tế, có một cách để có được một thể hiện từ sự ràng buộc mà không có tên. Nhưng bởi vì tôi chân thành khuyên bạn không nên làm điều này, tôi không cho thấy làm thế nào để điều này ở đây. Nếu bạn vẫn muốn làm điều đó theo cách này tôi sẽ cho bạn biết sau này làm thế nào điều này sẽ làm việc.

Nếu bạn đang làm điều đó một cách tốt hơn và ưa thích và tiêm cho người sử dụng cho các đối tượng yêu cầu nó như sự phụ thuộc có hai tùy chọn:

  1. Các dễ dàng hơn một: Cung cấp cho người đầu tiên ràng buộc một tên và thêm thuộc tính có tên vào các tham số, ví dụ ctor ([tên ("newuser") IUser newuser, [tên ("hiện tại")] IUser CurrentUser)
  2. Hoặc cách ưa thích để giữ cho lớp thực hiện miễn khuôn khổ IoC: Chỉ định thuộc tính tùy chỉnh và thêm chúng đến các tham số ví dụ ctor ([Người dùng mới] IUser newUser, [CurrentUser] IUser currentUser). Thay đổi Bindings để:

    Bind<User>().ToSelf() 
          .WhenTargetHas<NewUserAttribute>(); 
    Bind<User>().ToMethod(LoadCurrentUser) 
          .InRequestScope() 
          .WhenTargetHas<CurrentUserAttribute>(); 
    
+0

Xin lỗi vì sự chậm trễ dài để đáp ứng, tôi không thể làm một trong những bởi vì khi một người dùng mới đang được yêu cầu, mà đang xảy ra thông qua NHibernate. Vì vậy, tôi không thể thêm tên hoặc thuộc tính vào đó. Tôi có thể trong các trường hợp mà tôi muốn người dùng hiện tại, nhưng sau đó ràng buộc người dùng mới sẽ vẫn áp dụng. –

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