1

定製ModelMetadataProvider我使用這個使用國際奧委會提供MVC3

ModelMetadataProviders.Current = new RedSandMetadataProvider(ModelMetadataProviders.Current); 

目前覆蓋默認ModelMetadataProvider Global.asax文件中,這完美的作品。但是我想使用MVC3的IDependancyResolver特性來讓IoC提供ModelMetadataProvider實現。我正在使用StructureMap來完成它(只需將它安裝到使用NuGet的項目中),但出於某種原因,它的行爲並不像預期的那樣。

x.For<ModelMetadataProvider>().Use(new RedSandMetadataProvider(ModelMetadataProviders.Current)); 

我把一個斷點的RedSandMetadataProvider()構造和它擊中。而且我還在自動添加的SmDependencyResolver.cs文件的GetServices()函數上放置了一個斷點,以確保它是調用我的構造函數的IoC,並且一切看起來都很好,構造函數在第二頁加載時調用,但我認爲它永遠不會調用我的MetadataProvider的GetMetadataForProperty()函數。現在我知道,當我在Global.asax中設置它時,會得到相應的調用,但每次我嘗試使用IoC獲得相同的結果時,都會看到在我的類上調用的構造函數,就是這樣。我嘗試將一個.Singleton()添加到該類型的StrctureMap註冊中,這會使我的構造函數更快地被調用,但它在構造之後仍然不會實際使用該對象。

我錯過了什麼嗎?

+0

您是否想過使用StructureMap創建一個簡單的Bootstrapper,然後創建一個Bootstrap任務來配置您的Metatdata提供程序? – Paul 2011-03-12 04:59:35

+0

這只是配置StrcutureMap的一種不同的方式,我已經設置了它我只是無法弄清楚爲什麼DependencyResolver適用於我所用的所有東西,除了我自定義的'ModelMetadataProvider'上的方法。我不知道這是我的實施還是什麼問題? – 2011-03-17 18:11:02

回答

1

您需要實現IMvcServiceLocator並調用MvcServiceLocator.SetCurrent()來告訴MVC使用StructureMap:http://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html

+0

我使用的是MVC3,版本3引入了IDependencyResolver來替換IMvcServiceLocator,並且我已經註冊了StructureMap作爲依賴解析器(之前我手動完成了這項工作,但包括使用WebActivator代替的StructureMap-MVC3包)。我知道它是有效的,因爲我自己實現ModelMetadataProvider的構造函數正在調用。我只是無法讓它在我的實現中使用這些方法。我已經完成了MVC的所有重要內容。 http://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html – 2011-03-15 23:06:28