1

我目前正在使用这个覆盖 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,并且一切看起来都很好,构造函数在我认为的第二页加载时被调用,但它从不调用我GetMetadataForProperty()的 MetadataProvider 的功能。现在我知道当我在 Global.asax 中设置它时会正确调用它,但是每次我尝试使用 IoC 实现相同的结果时,我都会看到在我的类上调用了构造函数,仅此而已。我尝试将 .Singleton() 添加到类型的 StrctureMap 注册中,这会导致我的构造函数更快地被调用,但它在构造后仍然从未真正使用过该对象。

我错过了什么吗?

4

2 回答 2

1

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

于 2011-03-15T17:43:28.030 回答
0

我在另一个问题中解决了这个问题。 使用 ModelMetadataProvider 和 ModelValidatorProvider 的 StructureMap 在 MVC3 中设置 DependancyResolver

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

于 2011-04-21T16:11:37.723 回答