2

mvc でコントローラーとアクションがどのように呼び出されるかを理解しようとしています。いろいろ読んだ後、Controller.cs クラス内にある ExecuteCore() メソッドが実行されることがわかりました。

protected override void ExecuteCore()
{
    // If code in this method needs to be updated, please also check the BeginExecuteCore() and
    // EndExecuteCore() methods of AsyncController to see if that code also must be updated.

    PossiblyLoadTempData();
    try
    {
        string actionName = RouteData.GetRequiredString("action");
        if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
        {
            HandleUnknownAction(actionName);
        }
    }
    finally
    {
        PossiblySaveTempData();
    }
}

public IActionInvoker ActionInvoker
{
    get
    {
        if (_actionInvoker == null)
        {
            _actionInvoker = CreateActionInvoker();
        }
        return _actionInvoker;
    }
    set { _actionInvoker = value; }
}

protected virtual IActionInvoker CreateActionInvoker()
{
    // Controller supports asynchronous operations by default. 
    return Resolver.GetService<IAsyncActionInvoker>() ?? Resolver.GetService<IActionInvoker>() ?? new AsyncControllerActionInvoker();
}

ExecuteCore() が実行を開始すると、ActionInvoker プロパティへの参照によって、IActionInvoker の型が返されます。

IActionInvoker は、InvokeAction(ControllerContext, actionName) メソッドが実装されている AsyncControllerActionInvoker.cs クラスによって実装されます。

だから私の質問は:

  1. ここで IActionInvoker インターフェイスがどのようにインスタンス化され、ActionInvoker プロパティによって返されるのか?
  2. プロパティへの参照は AsyncControllerActionInvoker クラスのオブジェクトを返すので、そのオブジェクトを使用して InvokeAction(ControllerContext, actionName) メソッドを呼び出すことができます。
  3. と は何Resolver.GetService<IAsyncActionInvoker>()Resolver.GetService<IActionInvoker>()しますか?

これを理解するのを手伝ってください。

4

1 に答える 1

1

ASP.NET には、一種の依存性注入が組み込まれています。

つまり、特定のクラスへのハード参照ではなく、コントローラーがインターフェイスへの参照を持っているということです。次にResolver、インスタンスが要求されたときに特定のタイプを返すように構成されます。たとえば(サンプルコード、正確なメソッド名はわかりません)

Resolver.Bind<IActionInvoker>().To<ActionInvoker>();   // if an IActionInvoker is requested, return an instance of type ActionInvoker.

この構成の後、 を呼び出すとGetService、のインスタンスが取得されますActionInvoker

だから、あなたの質問に答えるために:

  1. ここで IActionInvoker インターフェイスがどのようにインスタンス化され、ActionInvoker プロパティによって返されるのか?

リゾルバーを事前に構成することで、リゾルバーは作成して返すタイプを認識します

  1. プロパティへの参照は AsyncControllerActionInvoker クラスのオブジェクトを返すので、そのオブジェクトを使用して InvokeAction(ControllerContext, actionName) メソッドを呼び出すことができます。

はいといいえ。IActionInvoker はい、このプロパティは、を呼び出すために使用できるを実装するオブジェクトがあることを保証しますInvokeAction。いいえ、それがタイプであることは保証されていませんIAsyncActionInvoker(リゾルバーの構成によって異なります)

  1. Resolver.GetService() と Resolver.GetService() は何をしますか?

これらは、指定されたインターフェイスを実装するオブジェクトをインスタンス化するようにリゾルバーに要求します。リゾルバーは、その構成でインターフェースを検索し、適切なオブジェクトをインスタンス化して、呼び出し元に返します。

依存性注入は、コードを分離する方法です。インターフェイスを参照するだけなので、ハードな依存関係はなく、DI コンテナーを再構成するだけResolverで (この場合)、クライアント クラスがそれを認識せずに別のクラスを使用することになります。

于 2013-05-08T17:59:57.243 に答える