如何找出处理请求的程序集

10
我有一个包含两个项目(AB)的Web解决方案,在B中引用了A。在A中,我有一个Html扩展方法,可以从AB中调用。
我的问题是,一旦方法被调用(通常是从局部视图),是否有一种方法可以在方法内部找出调用来自A还是B,而不需要传递任何参数?
我尝试查看HttpContext.Current.Request是否能找到有用的信息,但没有找到。我可以获取URI,但这仍然不能告诉我发起请求的文件位于哪个程序集中。
谢谢你们的答复-该方法返回一个字符串,字符串来自一个string.resx文件,我为每个程序集都有一个string.resx文件。这就是为什么我需要知道要访问哪个文件以返回字符串。由于每个程序集都会在启动时“注册”自己,所以如果我添加一个新程序集,我的方法将不会改变,因为它只会查找程序集。实际上,我的整个项目都不会改变。我之所以现在不添加另一个参数,是因为这将意味着大量的更改,而我并不认为这有什么好处。虽然我理解你的观点,并且基本上同意,但我认为在我的情况下,这个方法不是返回不同的内容,而只是根据程序集抓取正确的资源文件。

7
为什么你想这么做?听起来像是一个不好的主意。如果你添加另一个程序集会怎样?如果你将功能从一个程序集移动到另一个程序集会怎样?也许你应该在这个方法中添加一个参数,并在调用之间设置不同的值。 - John Saunders
1
@John:如果您不介意的话,我可以进一步阐述您所说的内容。 - Dan Abramov
2个回答

49

如 SLaks 指出 的那样,您可以检查 HttpContext.Current.Application.GetType().Assembly

然而,我同意评论中John的观点,如果您需要这个,您可能已经做出了糟糕的设计决策

问题

您的方法是伪善的。
它对不同的调用者说话不一样,但不会公开告诉它。

你看,每个方法都定义了一个特定的合同,包括参数和返回类型。
例如,int.Parse 表示它接受一个 string 并将其转换为一个 int。如果我们想改变默认行为,我们也可以给它 NumberStyles 和/或 IFormatProvider

我们作为消费者不知道 int.Parse 是如何实现的。因为它是 static 的,我们肯定希望它没有副作用,并且对于相同的参数集始终返回相同的值

请跟我重复这句话:

明确比隐晦更好。

如果您发现 int.Parse 会根据调用方的不同而改变其行为,您可能会非常生气。

定义上下文是调用者的责任,而不是被调用者的责任。

尽量简单明了地回答以下问题:

  • 如果从程序集C中调用该方法会发生什么?
  • 您将如何对其进行单元测试?如果其他开发人员在单元测试中使用此方法会怎样?
  • 如果重命名程序集A或B会发生什么?合并它们?进一步分割它们?
  • 如果出现上述任何情况,您是否会记得更改此方法?

如果以上任何问题的回答明显对您构成挑战,则表明您正在错误地进行操作。

相反,您应该...

引入参数

考虑该方法的契约。您能做些什么使其完整和描述性?

在单独的程序集中定义一个通用(英文)方法,它不知道调用者的任何信息且具有附加参数,并在具体程序集中定义填充参数的快捷方式。

最好这些参数也不知道程序集的任何信息。

例如,如果您需要在方法内解析URL,则可以接受string baseUrlFunc<string,string> urlResolver,因此它可能可用于任何关心这些内容的程序集。

最坏的情况下,您可以定义一个枚举来表示可能的调用者上下文,并将其传递给该方法。这将使您的设计问题明确化,而不是隐含的。显然的问题总比隐藏的问题好,尽管比没有问题更糟。


7
这个答案太棒了,我不仅收藏了这个问题,还打算写一篇博客来介绍你的答案。以后我会经常参考这个答案。 - John Saunders
2
@John:我尽力让答案有帮助性,你的赞扬让我感到愉悦。谢谢。 - Dan Abramov
3
抱歉,没有发布链接:http://johnwsaunders3.wordpress.com/2011/07/17/hypocritical-methods/ - John Saunders
7
我同意这个答案,评论和博客文章,可以放心,是那篇博客文章将我带到这里的,而且可能不仅是我一个人 :-) - TheBlastOne
博客文章来的请点赞@TheBlastOne的评论 :) - Habib

1

检查 HttpContext.Current.Application.GetType().Assembly


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接