我创建了一个"template"项目 A,它有 10 个 Controller (部分类)。
所有这些 Controller 都打包在一个 nuget 包中,并由项目 B、C 和 D 使用。nuget 在文件夹 controllers/_core
中生成 Controller ,因此它们很好地分开存储。 nuget 包没有对项目 A 的 dll 的引用。
现在开始解决问题; 可能是生成的 Controller 之一需要修改。通过添加第二个部分,我们可以添加一些逻辑,但我们可能需要重写现有方法以在方法内添加逻辑。因为这个(也因为我在下面添加的原因)我正在考虑从这些基本 Controller 继承。当我们继承一个基本 Controller 时,它应该被 MVC 排除。
示例:Image PersonController 是使用 nuget 包在 controllers/_core 文件夹中创建的,每个方法都是虚拟的。
然后,我们将在继承自 PersonController 的 Controller 文件夹中创建一个 _PersonController
,为了简单起见,仅重写了 index 方法。此时我们想要更改路由,使 localhost/Person/index 最终出现在 _PersonController
的 index 方法中,而不是 PersonController
的索引方法。 PersonController
应该被完全忽略。
每次我们需要覆盖时添加自定义路由是我唯一的选择吗?或者是否有针对此类问题的更好解决方案(自定义 MVC Controller 工厂?)? + 如何定义此类路由?
我考虑继承的额外原因: 每次我们更新 nuget 包时,它都会尝试覆盖对消费者项目 B、C 和 D 中生成的 Controller 所做的所有更改。
亲切的问候,
亚尼克
最佳答案
您可以使用 Controller 继承。
ASP.NET 核心
要忽略不需要的 Controller ,您需要实现 IApplicationFeatureProvider<ControllerFeature>
或来自 ControllerFeatureProvider
:
public class MyControllerFeatureProvider : ControllerFeatureProvider
{
protected override bool IsController(TypeInfo typeInfo)
{
var isController = base.IsController(typeInfo);
if (isController)
{
//overriding isController value
}
return isController;
}
}
然后在您的 Starup.ConfigureServices
您需要替换默认的 ControllerFeatureProvider
:
services.AddMvc()
.ConfigureApplicationPartManager(manager =>
{
var controllerFeatureProvider =
manager.FeatureProviders
.Single(p => p.GetType() == typeof(Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider));
manager.FeatureProviders[manager.FeatureProviders.IndexOf(controllerFeatureProvider)] =
new Attributes.MyControllerFeatureProvider();
});
ASP.NET MVC 5 及更早版本
在您的特定情况下,您可以在路由注册和设置中使用 namespace 列表 UseNamespaceFallback
至 false
忽略其他 namespace :
var myRoute = routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new [] {"Namespace1", "Namespace2"}
);
myRoute.DataTokens["UseNamespaceFallback"] = false;
关于c# - MVC 排除 Controller 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48783934/