我需要找到一种方法将MVC控制器放入与MVC项目不同的项目中。
我想我很亲密。我已经设置了Castle Windsor IoC容器,并将我的控制器安装在不同的项目中。我认为它挂在Web上.Config。我需要添加一个组件吗?这是我得到的当前例外:
没有支持的组件 服务 MySolution.Express.Controllers.HomeController 被发现
这是我的代码:
属于Castle Windsor的Web.Config部分
<section name="castle"
type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,
Castle.Windsor" />
</configSections>
(....)
<castle>
<components>
</components>
</castle>
Global.ascx
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());
ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Express.Controllers");
}
WindsorControllerFactory.cs
WindsorContainer container;
public WindsorControllerFactory()
{
container = new WindsorContainer(
new XmlInterpreter(new ConfigResource("castle"))
);
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where typeof(IController).IsAssignableFrom(t)
select t;
foreach (Type t in controllerTypes)
container.AddComponentWithLifestyle(t.FullName,t,
LifestyleType.Transient);
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
答案 0 :(得分:2)
好的,我明白了。这是Web.Config组件:
<component id="controller" type="MyProject.Express.Controllers.HomeController, MyProject.Express.Controllers" lifestyle="transient" />
答案 1 :(得分:2)
用于注册控制器的代码正在查看正在执行的程序集,因此无法找到控制器。正如您所发现的,一种解决方案是明确注册控制器。
或者,如果你使用MvcContrib.Castle,那么你可以用这样的东西替换你的WindsorControllerFactory构造函数中的第二行代码来注册来自控制器程序集的所有控制器:
container.RegisterControllers(typeof(HomeController).Assembly);