使用IoC在MVC3中提供自定义ModelMetadataProvider

时间:2011-03-12 00:32:40

标签: asp.net-mvc asp.net-mvc-3 structuremap modelmetadataprovider

我目前正在使用此

覆盖Global.asax文件中的默认ModelMetadataProvider
ModelMetadataProviders.Current = new RedSandMetadataProvider(ModelMetadataProviders.Current);

这完美无缺。但我想使用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注册中,这会导致我的构造函数被更快地调用,但它仍然没有在构造之后实际使用该对象。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您需要实现IMvcServiceLocator并调用MvcServiceLocator.SetCurrent()告诉MVC使用StructureMap:http://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html

答案 1 :(得分:0)

我在另一个问题中解决了这个问题。 Setting up DependancyResolver in MVC3 using StructureMap for ModelMetadataProvider & ModelValidatorProvider

如果您遇到问题,请查看。