suz*_*167 9 c# asp.net asp.net-mvc assemblies httprequest
我有一个包含两个项目(一个Web解决方案一和乙)与乙引用一个.
在A中我有一个Html显然可以从A或B调用的扩展方法.
我的问题是,一旦调用该方法(通常是从局部视图),方法内部是否有一种方法可以确定调用是来自程序集A还是程序集B而不传递任何内容?
我试着看看我能做什么HttpContext.Current.Request但找不到任何有用的东西.我可以获取URI,但仍然没有告诉我发起请求的文件位于哪个程序集中.
谢谢你的答案 - 该方法返回一个字符串,字符串来自string.resx文件,我有一个每个程序集.这就是为什么我需要知道要访问哪个文件以返回字符串.由于每个程序集在启动时"注册"自己,如果我添加一个新程序集,我的方法不会改变,因为它只会查找程序集.实际上我的整个项目不会改变.我之前没有引入另一个参数的原因是b/c它将意味着大量的变化,老实说我没有看到好处.虽然我看到你的观点并且我普遍同意它,但我认为在我的情况下,并不是该方法返回不同的东西,它只是根据程序集获取正确的资源文件.
Dan*_*mov 48
正如SLaks 指出的那样,你可以检查一下HttpContext.Current.Application.GetType().Assembly.
但是我同意约翰的评论,如果你需要,你可能做出了糟糕的设计决定.
你的方法是伪君子.
它与不同的呼叫者说话不同,但不公开告诉它.
你看,每个方法都定义了一个带有参数和返回类型的约定.
例如,int.Parse说它需要一个string并将其变成一个int.如果我们想要更改默认行为,我们也可以给它NumberStyles和/或IFormatProvider.
我们消费者不知道如何int.Parse实施.因为它是static,我们当然希望它没有副作用,并且将始终为同一组参数返回相同的值.
在我之后重复这个口头禅:
显式优于隐式.
如果您发现int.Parse以某种方式分析您的代码并根据其调用位置更改其行为,您可能会非常生气.
调用者负责定义上下文,而不是被调用者.
尝试给出以下问题的简单而简洁的答案:
如果回答上述任何问题显然对您构成了挑战,那就表明您正在做错了.
相反,你应该......
想想方法合同.您可以做些什么来使其完整且具有描述性?
在单独的程序集中定义通用(如英语)方法,该程序集不知道有关调用程序的任何内容并具有其他参数,并在具体程序集中为其定义参数填充快捷方式.
这些参数最好也不了解任何有关装配的信息.
例如,如果您需要解析方法中的URL,则可以接受string baseUrl或者Func<string, string> urlResolver可以从任何关注指定这些URL的程序集中使用它.
在最坏的情况下,您可以使用可能的调用者上下文定义枚举并将其传递给方法.这将使您的设计问题变得明确,而不是隐含.明显的问题总是比隐藏的问题好,虽然比没有问题更糟糕.
| 归档时间: |
|
| 查看次数: |
1675 次 |
| 最近记录: |