我有一个Web解决方案,其中包含两个项目(A、和B),其中B引用A。
在A中,我有一个明显可以从A或B调用的Html扩展方法。
我的问题是,一旦调用该方法(通常是从部分视图),方法中是否有一种方法可以确定调用是来自程序集A还是来自程序集B而不传递任何内容?
我试着看看是否可以用HttpContext.Current.Request做任何事情,但是找不到任何有用的东西。我可以获得URI,但这仍然不能告诉我发起请求的文件位于哪个程序集中。
感谢您的回答-该方法返回一个字符串,该字符串来自一个string.resx文件,我为每个程序集都提供了一个文件。这就是为什么我需要知道要访问哪个文件才能返回字符串。因为每个程序集在启动时“注册”自己--如果我添加了一个新的程序集--我的方法不会改变,因为它只会查找assembly.In事实--我的整个项目不会改变。我现在没有引入另一个参数的原因是b/c,它将意味着大量的更改,老实说,我没有看到它的好处。虽然我看到了您的观点,并且我大致同意它,但我认为在我的示例中,不是方法返回不同的东西,而是基于程序集获取正确的资源文件。
发布于 2011-07-01 19:05:16
作为SLaks pointed out,您可以检查HttpContext.Current.Application.GetType().Assembly。
但是,我同意John的意见,如果需要的话,您可能做出了一个糟糕的设计决策,。
问题
你的方法是个伪君子。
它对不同的来电者说的不一样,但不公开地告诉它。
您可以看到,每个方法都定义了带有参数和返回类型的特定契约。
例如,int.Parse说它接受一个string并将其转换为一个int。如果我们想改变默认行为,我们也可以给它NumberStyles和/或IFormatProvider。
我们消费者不知道int.Parse是如何实现的。因为它是static,所以我们最肯定的是它没有副作用,而且总是为相同的参数集返回相同的值。
在我后面重复这个咒语:
显式优于隐式.
如果您发现int.Parse以某种方式分析了您的代码并根据调用的位置更改了它的行为,您可能会非常生气。
--定义上下文是调用者的责任,而不是被调用者的.
试着简单简洁地回答以下问题:
如果方法是从程序集C调用的,那么
之上更改此方法
如果回答上面的任何问题对你来说都是一个挑战,这是你做错了™的一个迹象。
相反你应该..。
引入参数
考虑一下方法合同。你能做什么使它充分和描述?
在一个单独的程序集中定义一个泛型(如英文)方法,不知道调用者的任何信息,并且有附加的参数,并在具体的程序集中为它定义参数填充快捷键。
最好是这些参数也不知道任何关于程序集的信息。
例如,如果您需要解析方法中的URL,您可以接受string baseUrl或Func<string, string> urlResolver,这样它就可以从任何关心指定它们的程序集中使用。
在最坏的情况下,您可以用可能的调用上下文定义枚举,并将其传递给方法。这将使您的设计问题更加明确,而不是隐含的。明显的问题总是比隐藏的问题好,尽管比没有问题更糟糕。
发布于 2011-07-01 18:39:38
检查HttpContext.Current.Application.GetType().Assembly
https://stackoverflow.com/questions/6551954
复制相似问题