如何加载多个控制器工厂并将控制权传递给下一个?

时间:2011-03-01 16:31:17

标签: asp.net-mvc-3 controller-factory

我创建了一个通用控制器工厂,通过解析url:

来从数据库加载实体
entity/products/123456.htm

但是,我希望能够在未找到实体的情况下加载实际控制器,或者在必要时通过创建物理控制器来覆盖默认实体行为,而不是由URL创建的“虚拟”控制器图案。

现在,在global.asax.cs中我正在做:

ControllerBuilder.Current.SetControllerFactory(typeof(EntityControllerFactory));

如果我希望MVC的默认控制器/操作方案能够接管,我怎样才能在EntityControllerFactoryglobal.asax.cs中将控制权传递给另一家工厂?< / p>

1 个答案:

答案 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));