我正在开发一个使用Castle Windsor的MVC 5应用程序。我已经使用区域分隔我的代码以使其更易于管理。我还更新了我的实例化的IWindorInstaller类,以包含一个额外的方法,它将从这个新区域中找到控制器。
我的代码如下所示:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindStandardControllers());
container.Register(FindAdminControllers());
}
private BasedOnDescriptor FindStandardControllers()
{
return Classes.FromThisAssembly()
.BasedOn<IController>()
.If(Component.IsInSameNamespaceAs<HomeController>())
.If(t => t.Name.EndsWith("Controller"))
.LifestyleTransient();
}
private BasedOnDescriptor FindAdminControllers()
{
return Classes.FromThisAssembly()
.BasedOn<IController>()
.If(Component.IsInSameNamespaceAs<AdminController>())
.If(t => t.Name.EndsWith("Controller"))
.LifestyleTransient();
}
所有这一切都有效,但有没有更好的方法告诉温莎自动从每个新区域拿起所有控制器?
如果我想在每个区域中包含类似命名的控制器(例如:HomeController),我会特别担心。
答案 0 :(得分:1)
由于所有控制器都是从IController
继承的,因此您不应该指定命名空间和后缀。
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromThisAssembly()
.BasedOn<IController>()
.LifestyleTransient()
);
}
如果您拥有相同名称的控制器,它们将位于不同的命名空间中,Windsor将正确解析它们。