2010-09-09 28 views
8

我有一種情況,我想依賴注入我的用戶對象,但也將當前用戶放置在IoC容器中。我想下面的行工作:在Ninject 2.0中,如何爲特定案例同時具有一般綁定和綁定?

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

一個這樣可能會認爲綁定將工作:

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

當然,給出:

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.

我理解的錯誤,因爲一個命名綁定不限制該綁定的應用程序,所以這兩個綁定都適用。看起來很清楚,我需要使用.When *()方法的上下文綁定,但我不能想出任何方式來做到這一點。我覺得應該有方法來檢測是否應用了命名實例。喜歡的東西:

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

我找不到IRequest界面上的任何地方或它的屬性,告訴我所要求的名字。我該怎麼做呢?

回答

3

這個問題是answerd在郵件列表上: http://groups.google.com/group/ninject/browse_thread/thread/cd95847dc4dcfc9d?hl=en


如果你是通過調用獲取上的內核(我希望你不要)訪問用戶然後給第一綁定的名稱,如好,並且始終按名稱訪問用戶。實際上,有一種方法可以從綁定中獲取沒有名稱的實例。但是因爲我衷心推薦不要這樣做,所以我在這裏沒有說明如何去做。如果你仍然想這樣做,我會在稍後告訴你這是如何工作的。

如果你正在做的更好,首選的方式,注入用戶需要它作爲依賴的對象有兩種選擇:

  1. 較容易的一個:給第一綁定的名稱和爲參數添加一個命名屬性,例如構造函數([命名(「NEWUSER」)IUSER NEWUSER,[命名(「電流」)IUSER currentUser)
  2. 還是首選方式保持自由IoC框架的實現類:指定自定義屬性並添加他們對參數例如ctor([NewUser] IUser newUser,[CurrentUser] IUser currentUser)。綁定更改爲:

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

抱歉遲遲沒有迴應,因爲被請求的新用戶時,即通過NHibernate的發生我都做不到這些。所以我不能添加名稱或屬性。我可以在我想要當前用戶的情況下,但是新的用戶綁定仍然適用。 – 2012-01-16 21:35:54