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

本文关键字:程序集 请求 处理 何找出 | 更新日期: 2023-09-27 18:00:49

我有一个Web解决方案,它包含两个项目(aB(,B引用a

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

我的问题是,一旦调用了该方法(通常是从局部视图(,该方法内部是否有一种方法可以在不传递任何信息的情况下判断该调用是来自Assemblya还是AssemblyB

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


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

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

正如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,这样它就可以从任何关心指定这些URL的程序集中使用。

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

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