2010-08-17 51 views
0

this post有很大关系,我需要获取控制器文件夹中所有控制器的列表。目前我们只是在尝试一些东西。我已经通过API等搜索没有任何运气。我可以得到当前的控制器很好,但不幸的是没有其他人。MonoRail - 获取所有控制器

我不得不静态创建实例化控制器,我想要的列表,像这样:

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

这显然不是一个理想的解决方案。

干杯

+0

难道你不能使用反射吗? – 2010-08-17 08:19:29

+0

@Darin:我不知道那种功夫,到目前为止我从来没有用过它。 – Kezzer 2010-08-17 08:20:43

回答

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(); 
} 

这种方法的有效性是非常令人怀疑。在应用程序的生命周期中像这样实例化控制器可能是危险的。控制器不应该共享。将控制器的实例化保留给您正在使用的依赖注入框架。它们的寿命应该很短,最好限于当前的用户请求。

+0

谢谢,我会很快玩这个。我从来没有用过反射,所以这对我来说是一种学习体验。 – Kezzer 2010-08-17 08:26:04

+0

该解决方案有效,但是一些额外的设置必须由MonoRail完成,因为控制器上下文尚未实例化,因此控制器在调用其上的任何函数时会获得空引用异常。将不得不在这... – Kezzer 2010-08-17 08:30:50

+0

你的评论是有效的方式,我不应该这样做,但正如我所说的,我们现在正在试验一些事情。干杯! – Kezzer 2010-08-17 08:31:39