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

时间:2011-07-01 18:38:42

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

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

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

我的问题是,一旦调用该方法(通常是从局部视图),方法内部是否有一种方法可以确定调用是来自程序集 A 还是程序集 B 没有传递任何东西?

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


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

2 个答案:

答案 0 :(得分:48)

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

但是我同意约翰的评论,如果你需要,你可能做出了糟糕的设计决定

问题

  

你的方法是伪君子。
  它与不同的呼叫者说话不同,但不公开告诉它。

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

我们消费者不知道int.Parse是如何实施的。因为它是static,我们当然希望它没有副作用,将始终为同一组参数返回相同的值

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

  

明确胜过隐含。

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

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

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

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

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

相反,你应该......

介绍参数

考虑方法合同。您可以做些什么来使其完整且具有描述性?

  

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

这些参数最好不了解任何有关装配的信息。

例如,如果您需要解析方法中的网址,则可以接受string baseUrlFunc<string, string> urlResolver,以便可以从任何程序集中使用它们,这些程序集可以指定这些网址。

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

答案 1 :(得分:1)

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