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