Лучший способ реализовать стратегии создания контроллеров в MVC 3 - PullRequest
3 голосов
/ 24 октября 2011

У меня есть фабрика контроллеров, которая в зависимости от значений маршрута строит контроллер разными способами.Это:

  1. Если значения маршрута совпадают с маршрутом «модуля», он определяет правильный тип, используя значения маршрута для вычисления квалифицированного имени типа.Это происходит, если пользователь вводит [http://localhost:8080/siijyp/modules/Personas/Naturales/Documento/Display?id=1],, фабрика контроллеров строит и возвращает OIMSIIJYP.Web. * Personas.Naturales.Documento * Контроллер
  2. Если значения маршрута соответствуют «модулю»"route и содержит также значение" script ", фабрика контроллеров собирает контроллер во время выполнения с использованием Mono.CSharp
  3. Если значения маршрута не совпадают с модулем, он создает контроллер как DefaultControllerFactory делает это.

Совершенно очевидно, что все эти операторы if неверны, я также знаю, что есть тип IControllerActivator, который используется для DefaultControllerFactory для создания контроллера с заданным значением.Тип контроллера.Но я не знаю, что является лучшим способом реализации этих стратегий создания контроллеров в MVC 3.

Есть идеи?

Код:

public IController CreateController(RequestContext requestContext, 
    string controllerName)
{
    #region Argument checking
    if (requestContext == null)
{
        throw new ArgumentNullException("requestContext");
    }
    if (string.IsNullOrEmpty(controllerName))
    {
        throw new ArgumentException(
            "ControllerName cannot be null nor empty",     
            "controllerName");
    }
    #endregion
    Type controllerType = null;

    var routeData = requestContext.RouteData;
    if (IsRequestingAModule(routeData))
    {
        var module = routeData.Values["module"];
        var submodule = routeData.Values["submodule"];

        var controllerQualifiedName = string.Format(
            "OIMSIIJYP.Web.{0}.{1}.{2}Controller", module, 
            submodule, controllerName);
        try
        {
            controllerType = Type.GetType(controllerQualifiedName, true, 
                true);
            if (IsRequestingAScriptingBehavior(routeData))
            {
                return GetControllerRuntimeUsingMono(routeData, 
                    controllerName, controllerType);
            }
            else
            {
                return _container.Resolve(controllerType) as IController;
            }
        }
        catch (TypeLoadException)
        {
            throw new HttpException(404, 
                string.Format(CultureInfo.CurrentCulture, 
                "Controller not fount", new object[] {
                    requestContext.HttpContext.Request.Path
                }));
        }
    }
    else
    {
        var controllerTypes = 
            from type in Assembly.GetExecutingAssembly().GetTypes()
            where StringComparer.CurrentCultureIgnoreCase.Compare(
                type.Name, controllerName + "Controller") == 0
            select type;

        switch (controllerTypes.Count())
        {
            case 0:
                throw new HttpException(404, 
                    string.Format(CultureInfo.CurrentCulture, 
                    "Controller not found", new object[] {
                        requestContext.HttpContext.Request.Path
                    }));
            case 1:
                controllerType = controllerTypes.First();
                break;
            default:
                throw UnityControllerFactory.
                CreateAmbiguousControllerException(routeData.Route, 
                    controllerName, controllerTypes.ToList());
        }
    }

    return _container.Resolve(controllerType) as IController;
}

1 Ответ

3 голосов
/ 18 января 2012

Я думаю, что есть другой обходной путь, вы можете использовать Area. Предположим, у меня есть два контроллера с одинаковыми именами, но они хранятся в двух разных местах, один из них внутри области, а другой - нормально, например

admin/Controller/CommonController.cs //here admin is an area name
Controller/CommonController.cs

Теперь у меня есть два действия, оба пытаются отрендерить два разных представления.

@Html.Action("SystemInfo", "Common", new { area = "Admin" }) // here Admin is the area name
@Html.Action("HeaderLinks", "Common")

то же средство можно получить с помощью маршрутизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...