【问题标题】:How can I load multiple controller factories and pass control on to the next one?如何加载多个控制器工厂并将控制权传递给下一个?
【发布时间】:2011-03-01 16:31:17
【问题描述】:

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

entity/products/123456.htm

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

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

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

如果我希望 MVC 的默认控制器/操作方案接管,我如何在 EntityControllerFactoryglobal.asax.cs 将控制权交给另一个工厂?

【问题讨论】:

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


    【解决方案1】:

    您可以创建一个复合 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 2016-09-10
      • 2015-09-07
      • 1970-01-01
      • 2020-12-25
      • 2015-12-18
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多