3

Simple Injector MVC3 Integration パッケージをインストールしたところ、SimpleInjectorInitializer が App_Start フォルダーに配置されたようです。ただし、Verify() メソッドが Initialize() 内で呼び出されると、Entity Framework オブジェクト コンテキストを取得しようとすると、次のエラーが発生します (内部例外も提供しています)。

The supplied connection string is not valid, because it contains insufficient mapping or metadata information.
    InnerException: Unable to determine application context. The ASP.NET application path could not be resolved.
        InnerException: Exception has been thrown by the target of an invocation.
            InnerException: (Shown in browser) This method cannot be called during the application's pre-start initialization phase.

また、登録呼び出しを Global.asax.cs Application_Start() から SimpleInjectorInitializer の InitializeContainer() メソッドに移動する必要があるようにも見えました。

この時点で何をすべきか完全にはわかりませんが、この問題は次の質問に多少関連しているようです: Ninject 3.0.0-rc3 にアップグレードした後の接続文字列の例外

アプリケーションは、Entity Framework がそれ自体を認識する前にコンテキストを読み込もうとしているようで、接続文字列を適切に解析できませんか?

4

1 に答える 1

2

アプリケーションは、Entity Framework がそれ自体を認識する前にコンテキストを読み込もうとしているようで、接続文字列を適切に解析できませんか?

あなたは、絶対に正しい。このSimpleInjectorInitializer.Initializeメソッドは、アプリケーションの開始前フェーズで自動的に呼び出されます。Verify()この時点でコンテナーの構成に問題はありませんが、あなたの状況では、呼び出されるには時期尚早です。Verifyすべての登録を反復しGetInstance、それらを呼び出して、それを作成できるかどうかを確認します。ただし、アプリケーションの有効期間のその時点では、Entity Framework オブジェクト コンテキストを作成できません。EFフレームワークがASP.NETフレームワークについて何でも知っているのは奇妙だと思いますが、残念ながらそれはそうです。

この問題を解決するには、Verify()呼び出しを移動するか、完全な初期化をアプリケーションの起動後の時点に移動します。たとえば、次のことができます。

  1. SimpleInjectorInitializer.csクラスの[assembly: WebActivator.PreApplicationStartMethod](一番上の行) を削除します。
  2. グローバル asaxSimpleInjectorInitializer.Initialize()のイベントでメソッドへの呼び出しを追加します。Application_Start()

これを行った後、オブジェクト グラフの初期化 (特に検証) は、初期化前の状態の後に行われます。

container.Verify();別のオプションは、メソッドから呼び出しを削除するSimpleInjectorInitializer.Initializeことです。これは、初期の検証プロセスがあなたを殺しているためです。ただし、そうする前に、この「コンテナーの構成を確認する」を最初に読んで、代替手段を確認してください。

SimpleInjector.MVC NuGet パッケージでは、WebActivator.PreApplicationStartMethod便宜上 を使用しています。これにより、開発者がこれを機能させるために手動でコーディングする必要なく (もちろん、コンテナーの配線を除く)、パッケージを「そのまま機能させる」ことができます。しかし、これは Entity Framework を使用する場合には機能しないため、この戦略を再検討する必要があります。

于 2012-07-11T05:18:22.537 に答える