【问题标题】:Modify ControllerContext in CreateController method of DefaultControllerFactory in asp.net core mvc修改asp.net core mvc中DefaultControllerFactory的CreateController方法中的ControllerContext
【发布时间】:2018-08-05 04:17:03
【问题描述】:
  • 我想覆盖我的控制器方法。在这里,如果对 CatalogController 的请求,我已经覆盖了 DefaultControllerFactoryCreateController 方法以返回 CatalogCustomController 对象。

但问题在于我需要将所有依赖项传递给控制器​​构造函数。

 public class CustomControllerFactory: DefaultControllerFactory
{  
    public CustomControllerFactory(ICatalogModelFactory catalogModelFactory,
        IProductModelFactory productModelFactory,
        IControllerActivator controllerActivator, IEnumerable<IControllerPropertyActivator> propertyActivators)
        :base(controllerActivator, propertyActivators)
    {
        this._catalogModelFactory = catalogModelFactory;
        this._productModelFactory = productModelFactory;
    }
    public override object CreateController(ControllerContext context)
    {
        if (context.ActionDescriptor.ControllerTypeInfo.AsType() == typeof(CatalogController))
        {
            return new CatalogCustomController(_catalogModelFactory,
            _productModelFactory,
            _categoryService, 
        }

        return base.CreateController(context);
    }
}

虽然我想做这样的事情,但通过修改 ControllerContext 上下文

 public override object CreateController(ControllerContext context)
    {
        if (context.ActionDescriptor.ControllerTypeInfo.AsType() == typeof(CatalogController))
        {

            context.ActionDescriptor.ControllerName = "CatalogCustomController";   
        }

        return base.CreateController(context);
    }

【问题讨论】:

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


    【解决方案1】:

    您可以尝试将Controller 注册到IServiceCollection,然后从IServiceCollection 中的CreateController 中检索Controller

    1. AddControllersAsServices的扩展方法

      public static class Extension
      {
      public static IMvcBuilder AddControllersAsServices(this IMvcBuilder builder)
      {
          var feature = new ControllerFeature();
          builder.PartManager.PopulateFeature(feature);
      
          foreach (var controller in feature.Controllers.Select(c => c.AsType()))
          {
              builder.Services.TryAddTransient(controller, controller);
          }
      
          builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
      
          return builder;
      }
      }
      
    2. 注册服务

          services.AddMvc()
              .AddControllersAsServices();
      
    3. CustomControllerFactory

       public class CustomControllerFactory : DefaultControllerFactory
       {
      public CustomControllerFactory(
          IControllerActivator controllerActivator, IEnumerable<IControllerPropertyActivator> propertyActivators)
          : base(controllerActivator, propertyActivators)
      {
      }
      public override object CreateController(ControllerContext context)
      {
          if (context.ActionDescriptor.ControllerTypeInfo.AsType() == typeof(CatalogController))
          {               
              return context.HttpContext.RequestServices.GetRequiredService(typeof(CatalogCustomController));
          }
      
          return base.CreateController(context);
      }
      }
      

    【讨论】:

    • 感谢您的解决方案,它运行良好。
    【解决方案2】:

    我找到了一个解决方案,无需将控制器注册为服务。

    • 从主控制器继承自定义控制器。
    • 在自定义控制器工厂中,获取请求的控制器类型。
    • 将 ControllerTypeInfo 替换为自定义的

    公共覆盖对象 CreateController(ControllerContext 上下文)
        {
            类型 typeOfController = context.ActionDescriptor.ControllerTypeInfo.UnderlyingSystemType;
    
        if (typeOfController == typeof(Nop.Web.Controllers.CatalogController))
        {
            context.ActionDescriptor.ControllerTypeInfo = typeof(Controllers.CatalogCustomController).GetTypeInfo();
        }
        else if (typeOfController == typeof(Nop.Web.Areas.Admin.Controllers.ProductController))
        {
            context.ActionDescriptor.ControllerTypeInfo = typeof(Areas.Admin.Controllers.ProductCustomController).GetTypeInfo();
        }
        return base.CreateController(context);  
    }<pre>
    

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多