2012-01-25 18 views
0

IControllerFactory.GetControllerInstance()が呼び出される前にカスタムコードを実行する必要があります。IControllerFactory.GetControllerInstance()が呼び出される前にカスタムコードを実行するにはどうすればよいですか?

私はHtppApplication.BeginRequestイベントを使用して見てきましたが、それはのためにサーバーに対して行われたすべての要求(静的リソースに対する要求を含む)に自分のコードを実行します - 理想的ではないが。

これを達成するために使用できるMVCの拡張ポイントがありますか?

+0

実行するときに 'BeginRequest'で呼びたくない場合は? 'ApplicationStart'? –

+0

'BeginRequest'の後、理想的です。私は 'BeginRequest'の中でそれを実行することができましたが、可能であれば静的リソース要求に対しては実行したくありません。 –

+0

コントローラリクエストでのみ実行しますか? –

答えて

1

私はあなたがこれを行う必要があるとは思えませんが、私は自分のIControllerFactoryを作成するのが最も簡単だと思います。 MVC3には、新しいインターフェイスIControllerActivatorもあります。ここで

public interface IControllerActivator 
{ 
    /// <summary> 
    /// When implemented in a class, creates a controller. 
    /// </summary> 
    IController Create(RequestContext requestContext, Type controllerType); 
} 

は、それが私だったら、私はを通じてコードを実行したい、スタートアップ/ブートストラッププロセスの

public class UnityControllerFactory : DefaultControllerFactory 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    private readonly IUnityContainer _container; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="UnityControllerFactory"/> class. 
    /// </summary> 
    /// <param name="container">The container.</param> 
    /// <param name="controllerActivator">The controller activator.</param> 
    public UnityControllerFactory(IUnityContainer container, IControllerActivator controllerActivator) 
     : base(controllerActivator) 
    { 
     ////Guard.ArgumentNotNull(container, "container"); 
     _container = new PerRequestUnityContainer(container); 
    } 

    /// <summary> 
    /// Releases the specified controller. 
    /// </summary> 
    /// <param name="controller">The controller to release.</param> 
    public override void ReleaseController(IController controller) 
    { 
     if (controller != null) 
     { 
      _container.Teardown(controller); 
     } 

     base.ReleaseController(controller); 
    } 
} 

public class UnityControllerActivator : IControllerActivator 
{ 
    private readonly IUnityContainer _container; 

    public UnityControllerActivator(IUnityContainer container) 
    { 
     ////Guard.ArgumentNotNull(container, "container"); 
     _container = new PerRequestUnityContainer(container); 
    } 

    /// <summary> 
    /// When implemented in a class, creates a controller. 
    /// </summary> 
    /// <returns> 
    /// The created controller. 
    /// </returns> 
    /// <param name="requestContext">The request context.</param><param name="controllerType">The controller type.</param> 
    public IController Create(RequestContext requestContext, Type controllerType) 
    { 
     ////Guard.ArgumentNotNull(requestContext, "requestContext"); 
     ////Guard.ArgumentNotNull(controllerType, "controllerType"); 

     // do what ever you need to before creating your controller 

     IController controller = (IController)_container.Resolve(controllerType); 
     return controller; 
    } 
} 

とどこか、

IUnityContainer container = ...; 

// resolve our factory (and any of it's dependencies) 
IControllerFactory factory = container.Resolve<IControllerFactory>(); 
ControllerBuilder.Current.SetControllerFactory(factory); 
+0

良い提案。それはうまくいった。承認されたものとしてマーキングする。 –

1

Unityの使用例です。カスタムBaseController

public class BaseController : System.Web.Mvc.Controller 
{ 
    public BaseController() 
    { 
    } 

    protected override System.Web.Mvc.IActionInvoker CreateActionInvoker() 
    { 
     // Call Custom Code Here 

     return base.CreateActionInvoker(); 

    } 
} 

そこから、必要に応じてベースコントローラーを継承します。

public class MyController : MyApp.BaseController 
{ 

} 
+0

これは可能ですが、できるだけベースコントローラーを使用しないでください。 –

関連する問題