C# 如何找出哪个程序集处理了请求
我有一个Web解决方案,它包含两个项目(a和B),其中B引用a 在A中,我有一个C# 如何找出哪个程序集处理了请求,c#,asp.net,asp.net-mvc,assemblies,httprequest,C#,Asp.net,Asp.net Mvc,Assemblies,Httprequest,我有一个Web解决方案,它包含两个项目(a和B),其中B引用a 在A中,我有一个Html扩展方法,显然可以从A或B调用 我的问题是,一旦调用了该方法(通常从局部视图),该方法内部是否有一种方法可以确定调用是来自Assemblya还是AssemblyB,而不向其传递任何信息 我试图查看是否可以使用HttpContext.Current.Request执行任何操作,但找不到任何有用的内容。我可以获取URI,但这仍然不能告诉我发起请求的文件所在的程序集 感谢您的回答-该方法返回一个字符串,该字符串来
Html
扩展方法,显然可以从A或B调用
我的问题是,一旦调用了该方法(通常从局部视图),该方法内部是否有一种方法可以确定调用是来自Assemblya还是AssemblyB,而不向其传递任何信息
我试图查看是否可以使用HttpContext.Current.Request
执行任何操作,但找不到任何有用的内容。我可以获取URI,但这仍然不能告诉我发起请求的文件所在的程序集
感谢您的回答-该方法返回一个字符串,该字符串来自string.resx文件,我为每个程序集提供了一个该文件。这就是为什么我需要知道访问哪个文件才能返回字符串。由于每个程序集在启动时都会“注册”,如果我添加一个新的程序集,我的方法不会改变,因为它只会查找程序集。事实上,我的整个项目不会改变。我现在不引入另一个参数的原因是b/c,这将意味着巨大的变化,我真的看不到它的好处。虽然我明白你的观点,并且大体上同意你的观点,但我认为在我的例子中,方法并不是返回不同的东西,它只是根据程序集获取正确的资源文件。检查
HttpContext.Current.Application.GetType().assembly
作为SLaks,你可以检查HttpContext.Current.Application.GetType().Assembly
但是,我同意John的意见,即如果需要,您可能做出了错误的设计决策
问题
你的方法是伪君子。它会对不同的来电者说不同的话,但不会公开说出来 您可以看到,每个方法都定义了一个带有参数和返回类型的特定契约。
例如,
int.Parse
表示它接受一个字符串
,并将其转换为int
。如果我们想更改默认行为,我们还可以给它numberstyle
和/或IFormatProvider
我们这些消费者不知道int.Parse
是如何实现的。因为它是静态的
,所以我们非常希望它没有副作用,将始终为同一组参数返回相同的值
跟着我重复这个咒语:
显式优于隐式。
如果发现int.Parse
以某种方式分析代码并根据调用的位置更改其行为,您可能会非常生气
定义上下文是呼叫方的责任,而不是被呼叫方的责任。
试着对以下问题给出简单明了的答案:
- 如果从程序集C调用该方法,会发生什么
- 您将如何对其进行单元测试?如果其他开发人员在单元测试中使用这种方法呢
- 如果重命名程序集A或B,会发生什么情况?合并它们?把他们进一步分开
- 如果发生上述情况,您是否记得更改此方法?
string baseUrl
或Func urlResolver
,因此它可能可用于任何需要指定这些URL的程序集
在最坏的情况下,可以使用可能的调用方上下文定义枚举并将其传递给方法。这将使您的设计问题显式化,而不是隐式化。明显的问题总是比隐藏的问题好,尽管比没有问题更糟。为什么要这样做?这听起来是个坏主意。如果添加另一个程序集怎么办?如果将功能从一个程序集移动到另一个程序集怎么办?也许你应该给这个方法添加一个参数,并在两次调用之间设置不同的参数。@John:如果你不介意的话,我对你说的内容进行了扩展。这个答案太好了,我不仅喜欢这个问题,而且还打算在博客上介绍你的答案。在今后的几年里,我都会参考这个答案。@John:我试着让这个答案对我有帮助,你的好话让我很高兴。谢谢。抱歉,从未发布过链接:我同意答案、评论和博客条目,请确保博客条目是我来到这里的原因,而且我不是唯一一个,可能:-)来自upvote@TheBlastOne评论的人:)