0

デフォルトのファクトリがコントローラの完全な名前(名前空間付き)を返さないのはなぜですか? Service Locator と autofac を使用しています。

using System.Web.Mvc;

using Microsoft.Practices.ServiceLocation;

namespace Application.Core.MVC
{

        public override IController CreateController(System.Web.Routing.RequestContext requestContext, string **controllerName**)
        {
            return ServiceLocator.Current.GetInstance<IController>(controllerName);
        }
}

私は2つのホームコントローラーを持っていました(エリアブログの下に1つ)

http://localhost/ホーム

http://localhost/ブログ/ホーム

controllerName は、上記のコードで両方の完全修飾名なしで「ホーム」のみを返します。これにより、依存性注入のためにコントローラーの名前を登録しようとすると問題が発生します。この状況に応じて、コントローラーを今すぐ登録する方法を次に示します。これでも例外なくページが表示されます。しかし、 http://localhost/Homeにアクセスすると 、両方のコントローラーが関係なく呼び出されました。

   foreach (var tp in currentAssemblyControllersTypes)
                    builder.Register(tp).FactoryScoped().Named(tp.Name.Replace("Controller", ""));

誰でも助けてくれますか?ありがとう。

4

2 に答える 2

2

DefaultControllerFactory.CreateController()メソッドは、指定された要求のコントローラーを返す役割を果たします。controllerNameパラメーターは、ルートの{controller}部分にすぎません。URLで指定されたコントローラー名を指定して適切なタイプを見つけるのは、 CreateController()の仕事であり、呼び出し元の仕事ではありません。

これを簡単にするために、DefaultControllerFactory.CreateController()は、GetControllerType()とGetControllerInstance()という2つの他のメソッドに委任します。元のコントローラー解決ロジック(タイプルックアップなど)を使用したいが、タイプのインスタンス化方法を変更するだけの場合は、CreateController()メソッドとGetControllerType()メソッドをそのままにして、GetControllerInstance()をオーバーライドします。これにより、複製する名前空間ルックアップロジックがすでに処理され、コードがはるかに単純になります。

于 2009-11-26T04:42:08.990 に答える
0

[リーバイスの回答に応じて更新]

1.各コントローラーをフルネームで明示的に登録します。

 foreach (var tp in currentAssemblyControllersTypes)
                builder.Register(tp).FactoryScoped().Named(tp.FullName)

//Application.Controllers.HomeController
//Application.Areas.Blog.Controllers.HomeController

2 .PDC09 デモに従って、Global.ascx.cs の Application.Controllers.HomeController の MapRoute() で名前空間を指定します。

    routes.MapRoute(
                    "Default",                                              // Route name
                    "{controller}/{action}/{id}",                           // URL with parameters
                    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults

                    ,new string [] { "Application.Controllers"}  //Specify namespace

      );

        }

3.GetControllerInstance() メソッド IoCControllerFactory.cs をオーバーライドする

Protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, System.Type controllerType)
 {
  return (controllerType == null)? base.GetControllerInstance(requestContext,controllerType):ServiceLocator.Current.GetInstance<IController>(controllerType.FullName);
 }
于 2009-11-25T21:04:52.790 に答える