我创建了一个通用控制器工厂,通过解析url:
来从数据库加载实体entity/products/123456.htm
但是,我希望能够在未找到实体的情况下加载实际控制器,或者在必要时通过创建物理控制器来覆盖默认实体行为,而不是由URL创建的“虚拟”控制器图案。
现在,在global.asax.cs中我正在做:
ControllerBuilder.Current.SetControllerFactory(typeof(EntityControllerFactory));
如果我希望MVC的默认控制器/操作方案能够接管,我怎样才能在EntityControllerFactory
或global.asax.cs
中将控制权传递给另一家工厂?< / p>
答案 0 :(得分:3)
您可以创建一个复合IControllerFactory
实现:
public class EntityControllerFactory : IControllerFactory {
private IControllerFactory defaultFactory = new DefaultControllerFactory();
public IController CreateController(RequestContext requestContext, string controllerName) {
if(needsCustomLogic) {
// do your custom logic here and return appropriate result
} else {
return defaultFactory.CreateController(requestContext, controllerName);
}
}
// same for the other methods on IControllerFactory
}
这是有效的,因为默认情况下ControllerBuilder.Current.GetControllerFactory()
的值是DefaultControllerFactory
的实例。
你也可以考虑让你的工厂更加面向未来(如果MVC的新版本开始从GetControllerFactory
返回不同的类型;不太可能,但可能会发生)通过获取默认实例并将其传递到您的工厂:
// in Global.asax
var defaultFactory = ControllerBuilder.Current.GetControllerFactory();
ControllerBuilder.Current.SetFactory(new EntityControllerFactory(defaultFactory));