2010-10-13 147 views
2

我有這樣的代碼,以便在ASP.NET MVC網站:默認構造

x.For<AccountController>().TheDefault.Is.ConstructedBy(() => new AccountController()); 

此代碼拋出,這似乎相當自我解釋的警告,但由於某種原因,當我使用「使用」的方法是似乎沒有工作。我知道我做錯了什麼,並希望得到一些幫助。

的警告是:

警告1 'StructureMap.Configuration.DSL.Expressions.CreatePluginFamilyExpression.TheDefault' 已過時:「 「喜歡使用()方法」

謝謝。

回答

1

如果你看一下xmlDoc中,對 「使用」 的方法的第三個過載時,這樣說:

速記說 TheDefault.IsThis(@object)

因此,簡單地這樣做:

For<AccountController>().Use(() => new AccountController()); 

雖然我不知道這是什麼點(注入一個具體的東西時,請求具體),除非這只是一個例子,你真的在​​做別的事情。

通常對於MVC控制器,您創建一個ControllerFactory - 我還沒有看到需要「明確」注入一個具體的控制器。

+1

+1「雖然我不確定這是什麼點」 – 2010-10-14 02:34:32

+0

恩,downvoter--謹慎解釋? – RPM1984 2010-10-14 11:12:19

+0

雖然我不是downvoter,但我認爲這是因爲您的答案是錯誤的,並且與原始代碼的結果會有很大不同。既然它被標記爲答案,你應該編輯它來使用lambda,就像我的答案一樣。 – 2010-10-14 13:17:40

6

現有代碼的直接等同,但隨着新的API,是:

For<AccountController>().Use(() => new AccountController()); 

這將創建的AccountController的新實例請求的AccountController的一個實例的任何時間。

警告:如果您將一個對象實例(如RPM1984建議)而不是lambda傳遞給Use()方法,您將得到一個單例 - 每次請求AccountController時都會返回同一個實例。這與以前使用Is.ConstructedBy()語法執行的代碼的行爲非常不同。

+0

+1 - 單身人士的好處。甚至沒有想到這一點!我總是在'.Use'語句之前使用'.Singleton()'或'.HybridHttpOrThreadLocalScoped()'。這樣更安全。 – RPM1984 2010-10-14 02:50:30

+0

謝謝你的警告,我其實遇到了這個問題。 – Lukasz 2010-10-14 03:14:32