在 ASP.NET Core 中替换硬编码字符串都有哪些好的做法?

Posted

技术标签:

【中文标题】在 ASP.NET Core 中替换硬编码字符串都有哪些好的做法?【英文标题】:What are good practices for replacing hardcoded strings in ASP.NET Core?在 ASP.NET Core 中替换硬编码字符串有哪些好的做法? 【发布时间】:2022-01-11 02:13:32 【问题描述】:

首先让我说我是一名学生,但我的教育即将结束。

我正在开发一个 ASP.NET Core 应用程序作为我的期末考试项目,并且有一个关于在引用控制器和视图时使用硬编码字符串的问题。

一个例子是在我的视图中,我正在使用@URL 帮助器为特定视图创建 URL。这意味着我要给它两个字符串来寻找

@Url.Action("UploadVideo", "Practitioner")

我有拼写错误的习惯,这让 *** 很痛苦,启动应用程序却被告知视图不存在并意识到我错过了一封信。 我的想法是通过枚举类型来控制它。

我会注册一个名为 Controllers 的枚举

public enum Controllers

    AdminController,
    ClientController,
    HomeController,
    PractitionerController

并为每个具有相应视图的控制器注册一个枚举。

public enum AdminControllerViews

    Admin,
    CreateNewPractitioner,
    UpdatePractitioner

然后我将使用枚举来引用所有内容,就像前面的示例一样

@Url.Action(
   PractitionerControllerViews.UploadNewVideo.ToString(),
   Controllers.Practitioner.ToString()
)

这会是糟糕的代码吗? 我相信这将是强类型代码,如果我更改视图的名称,它会更容易。我没有在所有视图中摸索,而是在其中使用了它。

这样做的缺点是

不必要的代码 使用前需要在枚举中“注册”所有新视图

【问题讨论】:

使用带有字符串常量的类来代替枚举。那时不需要 ToString,但你仍然需要提供常量 @HansKesting 我明白你对只包含常量的静态类的意思。在我的示例中,我将其划分为每个控制器的视图。然后我应该为每个控制器创建一个类,并为控制器的名称创建一个类,还是将所有内容都放在一个类中,并使用预定义的 Enumerables? 使用类而不是枚举有什么好处?一般都是好奇的,因为我们的老师从来没有提到过,所有的例子都用了字符串。但我会向他发送一封包含我的问题的电子邮件,然后查看他的回复。 一个 const 可能有非常轻微的速度优势:该值将被直接包含而不是方法调用。 Const (or enum) over "magic string" : 编译器检查错别字和(值分布在好的类/枚举上)对可用值的一些智能帮助 在我短暂的研究时间里,我实际上遇到了一个解决方案,我认为这就是您的意思。我发现的帖子使用 T4 模板(尚未使用它)。 Using_T4_Templates_to_Create_Strongly_Typed_View_Names。但它不必自己编写,而是检查文件并为控制器和视图属性生成类。 【参考方案1】:

选项 1:

有一个实现源码生成器的nuget库

https://github.com/sleeuwen/UrlActionGenerator

它将扫描您的项目中的所有控制器和操作,并生成强类型扩展方法来生成链接。

选项 2:

使用nameof 运算符,如Url.Action(nameof(Controller.Method), nameof(Controller))

选项 3:

创建使用 lambda 表达式的自定义扩展方法,然后解析它们。 Url.Action<Controller>(c => c.Method())。您需要自己实现表达式解析器。

【讨论】:

我会研究选项。关于选项 1:我想在 URL 生成之外使用它,例如。在返回 RedirectToAction(method, controller) 的方法中。关于选项 2:我有默认的 HomeController。使用 nameof(HomeController) 时,它按预期返回“HomeController”。但是 ASP.NET 只想要“主页”。要么我需要一些功能来删除控制器部分,要么重写自定义路由。关于选项 3:如果我想在 Url 之外使用它,我需要为每个用例提供一个扩展方法。但我很欣赏你的回答。 您应该使用 nameof 命令。无需使用枚举并保持同步。要将“HomeController”映射到“Home”,只需编写一个扩展方法,将“Controller”替换为 string.Empty @citronas 是的,这将是一个简单的解决方案。我分为使用 nameof() 方法和静态类。但仔细想想,我找不到使用 nameof 的缺点,而类需要维护。

以上是关于在 ASP.NET Core 中替换硬编码字符串都有哪些好的做法?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

ASP.NET Core用配置文件来设置授权角色

2021-06-28 .NET高级班 73-ASP.NET Core AutoMapper的使用

ASP.Net Core中使用jquery-ajax-unobtrusive替换Ajax.BeginForm

用"hosting.json"配置ASP.NET Core站点的Hosting环境

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)