Asp.net mvc 使用IoC在MVC3中提供自定义ModelMetadataProvider

Asp.net mvc 使用IoC在MVC3中提供自定义ModelMetadataProvider,asp.net-mvc,asp.net-mvc-3,structuremap,modelmetadataprovider,Asp.net Mvc,Asp.net Mvc 3,Structuremap,Modelmetadataprovider,我目前正在使用以下命令覆盖Global.asax文件中的默认ModelMetadataProvider ModelMetadataProviders.Current = new RedSandMetadataProvider(ModelMetadataProviders.Current); 这是完美的。但是我想使用MVC3的IDependancyResolver特性,让IoC提供ModelMetadataProvider实现。我正在使用StructureMap来完成它(只是使用NuGet将其安

我目前正在使用以下命令覆盖Global.asax文件中的默认ModelMetadataProvider

ModelMetadataProviders.Current = new RedSandMetadataProvider(ModelMetadataProviders.Current);
这是完美的。但是我想使用MVC3的IDependancyResolver特性,让IoC提供ModelMetadataProvider实现。我正在使用StructureMap来完成它(只是使用NuGet将其安装到项目中),但由于某些原因,它的行为并不像预期的那样

x.For<ModelMetadataProvider>().Use(new RedSandMetadataProvider(ModelMetadataProviders.Current));
x.For().Use(新的redsandmataprovider(modelmataproviders.Current));
我在
RedSandMetadataProvider()
的构造函数上放置了一个断点,它被击中了。我还在自动添加的smdependencysolver.cs文件的
GetServices()
函数上设置了一个断点,以确保调用我的构造函数的是IoC,而且一切似乎都很好,我认为构造函数在第二次页面加载时被调用,但它从不调用我的
GetMetadataForProperty()
我的元数据提供程序的功能。现在我知道,当我在Global.asax中设置它时,会正确地调用它,但是每次我尝试使用IoC实现相同的结果时,我都会看到在我的类上调用构造函数,就是这样。我尝试将.Singleton()添加到该类型的StrctureMap注册中,这会导致我的构造函数更快地被调用,但它在构造完对象后仍然从未实际使用过该对象


我遗漏了什么吗?

你需要实现IMvcServiceLocator并调用MvcServiceLocator.SetCurrent()告诉MVC使用StructureMap:

你需要实现IMvcServiceLocator并调用MvcServiceLocator.SetCurrent()告诉MVC使用StructureMap:

我在另一个问题中解决了这个问题。


如果您在这方面遇到问题,请查看。

我在另一个问题中解决了这个问题。


如果您在这方面遇到问题,请查看。

您是否想过使用StructureMap创建一个简单的引导程序,然后创建一个引导任务来配置Metatdata提供程序?这只是配置StructureMap的另一种方式,我已经有了它的设置,我只是不明白为什么DependencyResolver适用于我使用过的所有东西,除了自定义
ModelMetadataProvider上的方法之外。我不知道这是我的实现的问题还是什么?您是否想过使用StructureMap创建一个简单的引导程序,然后创建一个引导任务来配置Metatdata提供程序?这只是配置StructureMap的另一种方式,我已经有了它的设置,我只是不明白为什么DependencyResolver适用于我使用过的所有东西,除了自定义
ModelMetadataProvider上的方法之外。我不知道这是我的实现中的问题还是什么?我正在使用MVC3,第3版引入了IDependencyResolver来取代IMvcServiceLocator,并且我已经将StructureMap注册为依赖解析程序(我以前手动完成了这项工作,但包括StructureMap-MVC3包,它使用WebActivator来代替)。我知道它是有效的,因为我自己实现的
modelmataprovider
的构造函数正在被调用。我只是无法让它在我的实现中使用这些方法。我已经看过MVC的那套电影了。我正在使用MVC3,第3版引入了IDependencyResolver来取代IMvcServiceLocator,并且我已经将StructureMap注册为依赖解析程序(我以前手动完成了这项工作,但包括StructureMap-MVC3包,它使用WebActivator来完成)。我知道它是有效的,因为我自己实现的
modelmataprovider
的构造函数正在被调用。我只是无法让它在我的实现中使用这些方法。我已经看过MVC的那套电影了。