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
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>