【问题标题】:How to find out which assembly handled the request如何找出哪个程序集处理了请求
【发布时间】:2011-09-26 23:22:53
【问题描述】:

我有一个 Web 解决方案,其中包含两个项目(AB),其中 B 引用 A

A 中,我有一个 Html 扩展方法,显然可以从 AB 调用。

我的问题是,一旦方法被调用(通常从局部视图),方法内部是否有办法确定调用是来自 Assembly A 还是 Assembly B 没有传递任何东西给它?

我试图看看我是否可以用HttpContext.Current.Request 做任何事情,但找不到任何有用的东西。我可以获取 URI,但这仍然不能告诉我发起请求的文件在哪个程序集中。


感谢您的回答 - 该方法返回一个字符串,该字符串来自一个 string.resx 文件,每个程序集都有一个。这就是为什么我需要知道要访问哪个文件以返回字符串。由于如果我添加一个新的程序集,每个程序集在启动时都会“注册”自己,所以我的方法不会改变,因为它只会查找程序集。事实上我的整个项目不会改变。我现在不引入另一个参数的原因是 b/c 这将意味着大量的变化,老实说我没有看到好处。虽然我明白你的观点并且我大体上同意它,但我认为在我的情况下,方法并不是返回不同的东西,它只是根据程序集获取正确的资源文件。

【问题讨论】:

  • 为什么要这样做?这听起来是个坏主意。如果添加另一个程序集怎么办?如果您将功能从一个装配移动到另一个装配怎么办?或许您应该向此方法添加一个参数,并在调用之间进行不同的设置。
  • @John:如果你不介意的话,我会扩展你所说的内容。

标签: c# asp.net asp.net-mvc assemblies httprequest


【解决方案1】:

作为 SLaks pointed out,您可以查看HttpContext.Current.Application.GetType().Assembly

不过,我在 cmets 中同意 John 的观点,即 如果您需要这样做,您可能做出了错误的设计决定

问题

你的方法是个伪君子。
它与不同的呼叫者交谈不同,但不会公开告诉它。

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

我们消费者不知道int.Parse是如何实现的。因为它是static,我们当然希望它没有副作用,并且对于同一组参数总是会返回相同的值

在我之后重复这个口头禅:

显式优于隐式。

如果您发现 int.Parse 以某种方式分析您的代码并根据调用位置更改其行为,您可能会非常生气。

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

尝试对以下问题给出简单明了的回答:

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

如果回答上述任何问题显然对您构成挑战,则表明您做错了™。

你应该...

引入参数

想想方法契约。你可以做些什么来使它完整和具有描述性?

对调用者一无所知并具有附加参数的单独程序集中定义一个通用(如英文)方法,并在具体程序集中为其定义参数填充快捷方式。

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

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

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

【讨论】:

  • 这个答案太好了,我不仅收藏了这个问题,而且我还将在博客上写下你的答案。我会在未来几年里提到这个答案。
  • @John:我试图让答案有帮助,你的好话让我很高兴。谢谢。
  • 我同意答案、评论和博客条目,请放心,是博客条目将我带到这里,而且我不是唯一的,可能 :-)
  • blog entry 点赞@TheBlastOne 的评论来到这里的人 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 2015-12-30
    • 1970-01-01
    • 2012-03-19
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多