我有一个 Web 解决方案,其中包含两个项目(A 和 B),其中 B 引用 A。
在 A 中,我有一个 Html
扩展方法,显然可以从 A 或 B 调用它。
我的问题是,一旦方法被调用(通常是从局部 View ),方法内部是否有办法确定调用是来自程序集 A 还是程序集 B 没有传递任何东西给它?
我试图看看我是否可以用 HttpContext.Current.Request
做任何事情,但找不到任何有用的东西。我可以获得 URI,但仍然无法告诉我发出请求的文件在哪个程序集中。
感谢您的回答 - 该方法返回一个字符串,该字符串来自一个 string.resx 文件,每个程序集都有一个。这就是为什么我需要知道要访问哪个文件才能返回字符串。因为如果我添加一个新的程序集,每个程序集都会在启动时“注册”自己,我的方法不会改变,因为它只会查找程序集。事实上,我的整个项目都不会改变。我现在不引入另一个参数的原因是 b/c 这将意味着巨大的变化,老实说我看不到好处。虽然我明白你的观点并且我大体上同意它,但我认为在我的情况下并不是方法返回不同的东西,它只是根据程序集获取正确的资源文件。
最佳答案
作为 SLaks pointed out , 你可以查看 HttpContext.Current.Application.GetType().Assembly
.
但是我同意 John 的评论,如果您需要这个,您可能做出了错误的设计决定。
问题
Your method is a hypocrite.
It talks different to different callers but doesn't tell it in open.
你看,每个方法都定义了一个带有参数和返回类型的特定契约。
例如,int.Parse
说它需要 string
并将其变成 int
.如果我们想改变默认行为,我们也可以给它 NumberStyles
和/或 IFormatProvider
.
我们消费者不知道如何int.Parse
实现。因为它是static
,我们当然希望它没有副作用,并且将始终为同一组参数返回相同的值。
跟着我重复这个咒语:
Explicit is better than implicit.
如果你发现int.Parse
,你可能会非常生气以某种方式分析您的代码并根据调用位置更改其行为。
调用者有责任定义上下文,而不是被调用者的。
尝试对以下问题给出简单明了的答案:
- 如果从程序集 C 调用该方法会怎样?
- 您将如何对其进行单元测试?如果其他开发人员在单元测试中使用此方法怎么办?
- 如果重命名程序集 A 或 B 会怎样?合并他们?进一步拆分?
- 如果发生上述情况,您会记得更改此方法吗?
如果回答上述任何问题显然对您构成挑战,则表明您做错了™。
相反你应该...
引入一个参数
想想方法契约。您可以做些什么来使它完整且具有描述性?
Define a generic (as in English) method in a separate assembly that doesn't know anything about the callers and has additional parameters, and define parameter-filling shortcuts for it in concrete assemblies.
最好这些参数也不知道程序集的任何信息。
例如,如果您需要在您的方法中解析 URL,您可以接受 string baseUrl
或 Func<string, string> urlResolver
因此它可能可以从任何关心指定那些的程序集中使用。
在最坏的情况下,您可以定义一个具有可能的调用者上下文的枚举并将其传递给该方法。这将使您的设计问题明确,而不是隐含。明显的问题总是比隐藏的问题好,尽管总比没有问题差。
关于c# - 如何找出哪个程序集处理了请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6551954/