Как создать новый контроллер во время выполнения?

Представь 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#?

0 ответов

Другие вопросы по тегам