在 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当中应用)
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当中应用)