ASP.net mvc, универсальные / динамические контроллеры и Type.GetType: как я могу сохранить свои URL красивыми? - PullRequest
0 голосов
/ 23 декабря 2009

Используя информацию из некоторых вопросов здесь, касающихся общих представлений, я создал приложение MVC, которое считывает .dll из своего собственного каталога / bin и создает пользовательский интерфейс на лету. Частичные представления InputBuilder очень помогли. Я также сделал ControllerFactory после совета здесь и в других местах.

Моя проблема в том, что, когда все работает нормально, и отражение распознает типы, которые я передаю, GetType () требует полное имя, полное имя сборки ('scuse код, все еще прототипирование):

public IController CreateController(RequestContext requestContext, string controllerName)
        {
            Type controllerType = null;
            Type genericType;

            //controllerName coming in as full assembly-qualified path

            Type baseControllerType = typeof(CoreDataController<>);

                genericType = Type.GetType(controllerName);
                if (genericType != null)
                { 
                    controllerType = baseControllerType.MakeGenericType(genericType); 
                }
            if (controllerType != null)

            { 
                return Activator.CreateInstance(controllerType) as IController; 
            }

            return controllerType;

        }

Это заставляет мои URL выглядеть так:

http://localhost:1075/CoreData.Plans,%20PlansLib,%20Version=1.0.0.0,%20Culture=neutral,%20PublicKeyToken=null/Create

Очевидно, неоптимальный.

Что бы я хотел, это http://localhost:1075/CoreData.Plans/Create

или даже лучше:

http://localhost:1075/Plans/Create

Должен ли я хранить словарь, доступный для моего контроллера на Application_Start(), сопоставляя короткие имена с полностью определенными именами? Есть ли какая-то особенность Reflection, по которой я скучаю, которая решит эту проблему?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2009

У меня была эта проблема с длинными и даже несовместимыми именами типов на разных платформах, которые я использовал, и нашел способ поиска типа в dll, загруженных в текущий домен приложения.

public static Type GetTypeFromName(string TypeNameStr, Assembly[] Asms)
{
    Type VarType = null;
    string TypeStr = TypeNameStr.Split(',')[0];
    foreach (Assembly Dll in Asms)
    {
        VarType = Dll.GetType(TypeNameStr);
        if (VarType == null)
            VarType = Dll.GetType(TypeStr);
        if (VarType != null)
            break;
    }
    return VarType;
}

Все, что вам нужно сделать, это передать функции список сборок, которые вы можете получить из текущего домена приложения, и он попытается найти тип, откуда вы можете создать словарь, используя имя и тип для кеширования, так что что вам не нужно делать это снова и снова.

0 голосов
/ 23 декабря 2009

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

[UrlName("my-class-name")]
public class MyClassName
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...