Как создать новый контроллер во время выполнения?
Представь MVC
проект без какого-либо контроллера в этом решении. Я имею то же самое и хочу создать контроллер во время выполнения с помощью DefaultControllerFactory
затем зарегистрируйте его в моем Global.asax
от Autofac
, Здесь у меня есть образец фабрики контроллеров, который имеет CreateController
метод:
internal class CControllerFactory : DefaultControllerFactory
{
private readonly Dictionary<string, Func<RequestContext, IController>> _controllerMap;
public CControllerFactory()
{
List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList();
_controllerMap = new Dictionary<string, Func<RequestContext, IController>>();
foreach (Controller contr in lstControllers)
{
string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString();
_controllerMap.Add(ctrName, c => contr);
}
}
public override IController CreateController(RequestContext requestContext, string controllerName)
{
if (_controllerMap.ContainsKey(controllerName))
{
return _controllerMap[controllerName](requestContext);
}
else
throw new KeyNotFoundException(controllerName);
}
}
Как вы видите выше, эта строка: List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList();
получит список контроллеров, которые используют IController
оказание услуг. Но в моем случае в решении нет контроллера. Я хочу создать новый контроллер во время выполнения и добавить его в свой _controllerMap
,
Поэтому я изменил код на это:
internal class CControllerFactory : DefaultControllerFactory
{
private readonly Dictionary<string, Func<RequestContext, IController>> _controllerMap;
public CControllerFactory()
{
// *Don't need this*
// List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList();
_controllerMap = new Dictionary<string, Func<RequestContext, IController>>();
// *Don't need this Foreach*
// foreach (Controller contr in lstControllers)
// {
string ctrName = "Home";
// But what about contr in this line?!?!:
_controllerMap.Add(ctrName, c => contr);
// }
}
public override IController CreateController(RequestContext requestContext, string controllerName)
{
if (_controllerMap.ContainsKey(controllerName))
{
return _controllerMap[controllerName](requestContext);
}
else
throw new KeyNotFoundException(controllerName);
}
}
Так что насчет contr
в указанной строке? Этот аргумент должен быть типа Func<RequestContext,IController>
, Как я могу создать его функционально с помощью кода C#?