你能阻止mvc库中的方法(或者真的在任何类上)

时间:2017-02-03 13:23:13

标签: c# .net extension-methods

我们有一个使用多个域(带有租户)的项目,当我们需要生成一个绝对URL时,我们曾经这样做过:

var forgotUrl = Url.Action("Forgot", "Account", null, this.Request.Url.Scheme);

这很有效,有时你需要绝对的网址,例如发送带有重置密码链接的电子邮件。

但是,我们现在已经使用反向代理实施了SSL,这意味着this.Request.Url.Scheme不再为我们提供正确的域名。

因此我们必须做这样的事情

var forgotUrl = CurrentHostWithSchemeWithoutTrailingSlash + Url.Action("Forgot", "Account");

为了简化,我们制作了一个扩展方法,就像这样

Url.AbsoluteAction("Forgot", "Account", *data*)

这一切都像预期的那样有效,所以一切都很好,但是,你仍然可以通过写一行调用原始Url.Action并发送this.Request.Url.Scheme来解决问题。

所以我的问题很简单:有没有办法阻止使用它,要么隐藏它,要么给编译器错误,警告,什么?

1 个答案:

答案 0 :(得分:1)

对于方法是类成员的一般情况,您的真正选择是查找用法和更新代码。您可以使用&#34手动查找此类函数的所有案例;查找所有用法" (VS或VS + R#)不时或使用自动化工具。如果您使用VS 2015+,请参阅Finding all references to a method with Roslyn。对于旧版本或构建测试,您可以扫描代码,例如通过添加将加载程序集的单元测试,解析IL并断言错误的方法。

对于这种特殊情况,因为Url.Action是扩展方法 - 附加选项是在视图中默认可见的另一个静态类中创建具有相同签名的另一个扩展方法(例如namespace System; public static class MyHack{ ...Action(UrlHelper...)所以编译器将找到该方法的2个变体并显示错误。

同样,教育开发人员(即在代码审查期间)和可用的现有代码通常就足够了。如果项目中已经存在正确执行此操作的示例,则很有可能只是复制粘贴。