gpt4 book ai didi

c# - MVC 排除 Controller 使用

转载 作者:行者123 更新时间:2023-12-02 20:30:54 25 4
gpt4 key购买 nike

我创建了一个"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 列表 UseNamespaceFallbackfalse忽略其他 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com