Как выполнить пользовательский код перед вызовом IControllerFactory.GetControllerInstance ()? - PullRequest
0 голосов
/ 26 января 2012

Мне нужно выполнить пользовательский код перед вызовом IControllerFactory.GetControllerInstance().

Я рассмотрел использование события HtppApplication.BeginRequest, но при этом мой код выполнялся бы для каждого запроса к серверу (включая запросы на статические ресурсы) - не идеально.

Есть ли в MVC точка расширения, которую я могу использовать для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 26 января 2012

Если бы это был я, я бы запустил код через Custom 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
{

}
1 голос
/ 26 января 2012

Я не могу понять, зачем вам это нужно, однако, я думаю, самое простое - создать свой собственный IControllerFactory.В MVC3 также есть новый интерфейс IControllerActivator.

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

. Вот пример использования Unity,

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);
...