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