0

我创建了一个通用控制器工厂,通过解析 url 从数据库中加载实体:

entity/products/123456.htm

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

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

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

如果我希望 MVC 的默认控制器/操作方案接管,我如何在 中EntityControllerFactory或此处将控制权传递给另一个工厂?global.asax.cs

4

1 回答 1

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

GetControllerFactory您还可以考虑通过获取默认实例并将其传递给您的工厂,使您的工厂更具前瞻性(以防新版本的 MVC 开始返回不同的类型;不太可能,但它可能发生):

// in Global.asax
var defaultFactory = ControllerBuilder.Current.GetControllerFactory();
ControllerBuilder.Current.SetFactory(new EntityControllerFactory(defaultFactory));
于 2011-03-23T20:59:01.003 回答