Asp .net core MVC
在启动时自动检测项目中的控制器。我一直在寻找一种方法来防止某些Controllers
出现这种情况。结果,我发现可以实现IControllerFactory
来动态滤除控制器。但是,据我了解,它是用于创建控制器而不是检测。在没有实现IControllerFactory
或IControllerActivator
的情况下,我还有其他方法可以这样做吗?在启动时是否还有其他涉及控制器检测的组件?
IControllerActivator
由IControllerFactory
使用来创建控制器。
答案 0 :(得分:1)
您需要实现自己的IControllerActivator并在其中添加逻辑。
我建议向控制器添加一个属性,并在Create
方法中使用反射来启用/禁用控制器
public class CustomControllerResolver : IControllerActivator
{
public object Create(ControllerContext actionContext)
{
var actionDescriptor = actionContext.ActionDescriptor;
var controllerType = actionDescriptor.ControllerTypeInfo.AsType();
return actionContext.HttpContext.RequestServices.GetRequiredService(controllerType);
}
public virtual void Release(ControllerContext context, object controller)
{
}
}
在ServicesCollection中注册自定义解析器
services.Replace(ServiceDescriptor.Transient<IControllerActivator, CustomControllerResolver>());
答案 1 :(得分:0)
我找到了一种避免某些控制器被注册的方法。我们可以注册一个新的约定,该约定需要删除控制器的搜索并将其从控制器的列表中弹出。
public class ApplicationDescription : IApplicationModelConvention
{
public ApplicationDescription()
{
}
public void Apply(ApplicationModel application)
{
var ctr = application.Controllers.Where((model) => {
return model.ControllerType.IsEquivalentTo(typeof(IgnoredController));
});
if (ctr.Count() > 0)
{
foreach (var controller in ctr.ToList())
{
application.Controllers.Remove(controller);
}
}
}
}
使用MVC注册新约定
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc((options)=> {
options.Conventions.Add(new ApplicationDescription());
options.Conventions.Add(new ControllerDescriptionAttribute("aa"));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
}
}