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()が、ヒットしています。またGetServices()、自動的に追加された SmDependencyResolver.cs ファイルの関数にブレークポイントを設定して、コンストラクターを呼び出していたのが IoC であることを確認しました。すべて問題ないように見えます。コンストラクターは 2 回目のページ読み込みで呼び出されると思いますが、呼び出されません。私GetMetadataForProperty()のMetadataProviderの私の機能。Global.asax で設定すると、これが正しく呼び出されることがわかりましたが、IoC を使用して同じ結果を達成しようとするたびに、自分のクラスで呼び出されたコンストラクターが表示されます。それだけです。タイプのStrctureMap登録に.Singleton()を追加しようとしましたが、コンストラクターがはるかに早く呼び出されますが、オブジェクトが構築された後に実際に使用されることはありません。

何か不足していますか?

4

2 に答える 2

1

IMvcServiceLocatorを実装し、MvcServiceLocator.SetCurrent() を呼び出して、MVC に StructureMap を使用するように指示する必要があります。

于 2011-03-15T17:43:28.030 に答える