【发布时间】:2013-12-18 01:08:45
【问题描述】:
在这里有一个简单的问题。我有一个程序集被一些开发人员重用,其中包含各种功能,但在技术上被拆分为表示功能逻辑块的各种命名空间。
现在,它提供了尽可能少的公共命名空间。基本上,用户不应该知道(目前也不知道)他们尝试使用的类正在使用哪个内部结构。
假设你有这个:
-
NS1
- NS11
- 111 班
- 112 级
- NS 扩展
- 扩展类 1
- NS12
-
NS2
- ...
基本上,用户知道他们使用 FrameworkName.NS1 来实现有关 NS1 的一般功能。 现在,在这个简单的示例中,我将一个包含扩展方法的类放在子命名空间扩展中,所以基本上,如果最终用户尝试使用程序集,他必须实际知道 DLL 的内部结构才能知道扩展存在(这是智能感知不会告诉你你知道的例子之一)。
所以底线......现在我已经有了这个程序集,并且在内部(VS 项目)我像往常一样将项目划分为逻辑文件夹,但我不让命名空间跟随文件夹。这样,程序集就被拆分成逻辑块,用户知道这些逻辑块而不必知道内部结构,也不需要知道可能存在用于扩展的单独命名空间等。
现在,我个人希望我可以让代码的命名空间遵循我的文件夹结构,但在编译时以某种方式将这些子命名空间映射到主命名空间。
是否有可能以某种方式实现这种“重定向”?
简而言之,我希望能够在程序集外部将 NS1.NS11.Class111 公开寻址为 NS1.Class111,同时仍保持程序集内部的正确结构。
【问题讨论】:
-
有趣的问题。一种类型只能存在于一个命名空间中。如果您在(预)编译时将
NS1.NS11.Class111更改为NS1.Class111,您还必须更改对它的所有引用,因为现有(测试)代码将期望它位于NS1.NS11中。 -
我个人的想法是,你为什么不在内部使用与外部相同的命名空间?如果他们让外部人员感到困惑,那么为什么不让内部人员感到困惑?
-
这并不是因为它们令人困惑。只是最终用户不必知道内部结构就能完成他们的任务。假设您在内部有一个实用程序命名空间,其中包含例如“加密器”类,但您希望您的用户可以访问您的所有实用程序,而不必知道它被视为程序集中的实用程序。
-
该死,cmets 太矮了。 :-) 对于扩展类和自定义异常类也是如此,您希望最终用户能够访问 DLL 中可用的类,而无需手动记住每次都添加自定义内部 .extensions 命名空间,但一切都只需导入基础命名空间。
-
一个坏主意。代码应仅位于 1 个命名空间中,因此只需做出选择。当您不想遵循文件夹结构(只是一个明智的 VS 默认设置)时,请不要使用它。但不要在编译(发布)时更改它。那会破坏很多东西。
标签: c# .net namespaces