Asp.net core mvc 修改asp.net核心mvc中DefaultControllerFactory的CreateController方法中的ControllerContext 我想重写我的控制器方法。这里我重写了DefaultControllerFactory的CreateController方法,以便在请求CatalogController时返回CatalogCustomController对象

Asp.net core mvc 修改asp.net核心mvc中DefaultControllerFactory的CreateController方法中的ControllerContext 我想重写我的控制器方法。这里我重写了DefaultControllerFactory的CreateController方法,以便在请求CatalogController时返回CatalogCustomController对象,asp.net-core-mvc,controller-factory,Asp.net Core Mvc,Controller Factory,但这里的问题是,我需要将所有依赖项传递给控制器构造函数 public class CustomControllerFactory: DefaultControllerFactory { public CustomControllerFactory(ICatalogModelFactory catalogModelFactory, IProductModelFactory productModelFactory, IControllerActivato

但这里的问题是,我需要将所有依赖项传递给控制器构造函数

 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);
    }
}

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

  • addControllerAsservices的扩展方法

    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;
    }
    }
    
  • 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);
    }
    }
    
    公共类CustomControllerFactory:DefaultControllerFactory
    {
    公共客户控制器工厂(
    i控制器激活器控制器激活器,i可数属性激活器)
    :基本(控制器激活器、属性激活器)
    {
    }
    公共重写对象CreateController(ControllerContext上下文)
    {
    if(context.ActionDescriptor.ControllerTypeInfo.AsType()==typeof(CatalogController))
    {               
    返回context.HttpContext.RequestServices.GetRequiredService(typeof(CatalogCustomController));
    }
    返回base.CreateController(上下文);
    }
    }
    

  • 我找到了一个解决方案,不用将控制器注册为服务

    • 从主控制器继承自定义控制器
    • 在自定义控制器工厂中,获取所请求控制器的类型
    • 用自定义的ControllerTypeInfo替换ControllerTypeInfo
    公共重写对象CreateController(ControllerContext上下文) { 类型typeOfController=context.ActionDescriptor.ControllerTypeInfo.UnderlineingSystemType

    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();
    }
    返回base.CreateController(上下文);
    }
    
    感谢您的解决方案,它本应完美工作。
        services.AddMvc()
            .AddControllersAsServices();
    
     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);
    }
    }
    
    public override object CreateController(ControllerContext context) { Type 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>