MonoRail - получить все контроллеры

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

Мне пришлось статически создать список экземпляров контроллеров, которые я хочу, например:

public static IList<AbstractHtmlPageController> _controllers = new List<AbstractHtmlPageController>
{
    new HomeController(),
    new UserController()
};

Очевидно, это нежелательное решение.

Ваше здоровье


person Kezzer    schedule 17.08.2010    source источник
comment
@Darin: Я бы не знал такого кунг-фу, я никогда не использовал его до сих пор.   -  person Kezzer    schedule 17.08.2010


Ответы (1)


Вы можете попробовать использовать отражение (не тестировали):

public static IList<AbstractHtmlPageController> GetControllers()
{
    Assembly
        .GetExecutingAssembly()
        .GetTypes()
        .Where(t => 
            t != typeof(AbstractHtmlPageController) && 
            typeof(AbstractHtmlPageController).IsAssignableFrom(t)
        )
        .Select(t => (AbstractHtmlPageController)Activator.CreateInstance(t))
        .ToList();
}

Полезность такого метода весьма сомнительна. Создание экземпляров таких контроллеров на время существования приложения может быть опасным. Контроллеры не должны использоваться совместно. Оставьте создание экземпляров ваших контроллеров используемой вами структуре внедрения зависимостей. Их время жизни должно быть очень коротким, желательно ограниченным текущим запросом пользователя.

person Darin Dimitrov    schedule 17.08.2010
comment
Спасибо, я быстро с этим поиграюсь. Мне до сих пор не приходилось использовать рефлексию, так что это будет для меня познавательным опытом. - person Kezzer; 17.08.2010
comment
Решение работает, однако MonoRail должен выполнить некоторую дополнительную настройку, поскольку контроллеры получают исключения нулевой ссылки при вызове какой-либо функции на них, потому что контекст контроллера не был создан. Придется поработать над этим ... - person Kezzer; 17.08.2010
comment
Кстати, ваш комментарий действителен, я не должен этого делать, но, как я уже сказал, мы сейчас экспериментируем с некоторыми вещами. Ваше здоровье! - person Kezzer; 17.08.2010