创建使用.NET命名空间的库的最佳实践

创建使用.NET命名空间的库的最佳实践,.net,dependencies,libraries,coupling,.net,Dependencies,Libraries,Coupling,编写一个定义依赖于另一个库的接口的库是否是一种不好的做法 我知道紧密耦合是不好的,但这在使用.NET类时仍然适用吗 例如,在.NET中,如果我有一个返回颜色对象的库,它将强制依赖于System.Drawing,依赖于使用我的库的任何东西。在我的库中创建自己的颜色类型类会更好吗 如果它是一个标准的.NET库,我就不会担心它了。没有理由从一个类映射到另一个类。。。如果System.Color在下一个.NET版本中更改了怎么办?您还必须更改映射代码,并且可能必须检测版本并相应地映射。这真的很痛苦。对于

编写一个定义依赖于另一个库的接口的库是否是一种不好的做法

我知道紧密耦合是不好的,但这在使用.NET类时仍然适用吗


例如,在.NET中,如果我有一个返回颜色对象的库,它将强制依赖于System.Drawing,依赖于使用我的库的任何东西。在我的库中创建自己的颜色类型类会更好吗

如果它是一个标准的.NET库,我就不会担心它了。没有理由从一个类映射到另一个类。。。如果System.Color在下一个.NET版本中更改了怎么办?您还必须更改映射代码,并且可能必须检测版本并相应地映射。这真的很痛苦。

对于我所有的库,我返回的对象只依赖于库中的内容

我会问自己,为什么要编写一个依赖于另一个非隐式名称空间的库。这似乎与整个“封装”概念背道而驰


因此,仅凭我自己的推理和OOP知识,我就可以说您返回自己的非依赖对象是正确的。

我区分了稳定依赖关系

一般来说,Color看起来像是一个稳定的依赖项,因为它已经在BCL中,本质上是确定的,不涉及任何资源密集型进程外通信,也不依赖于运行时环境的特定设置

这里唯一需要考虑的是,当涉及到颜色时,BCL中有不止一个这样的类,因此请确保您真正的意思是只针对带有API的Windows窗体应用程序,因为WPF有自己的颜色定义

如果您只需要颜色以某种颜色绘制UI的某些部分,那么内置的颜色类可能很好,但是如果颜色是域模型中的一个主要概念,并且您需要针对不同的UI(WPF、Windows窗体、Web),那么您最好定义自己的抽象


在这种更高级的情况下,您可以随后围绕抽象创建适配器和映射器,以弥合抽象和具体颜色类之间的差距。

您提出了一个很好的问题。答案是:视情况而定。对于总是可用的标准库来说,那就好了;核心库始终引用不同的.dll

如果是第三方库,您会遇到问题。如果其他库满足了您的需求,那么您并不总是一个好主意,但是您需要依赖另一个库,这对于用户来说是一个后勤问题


这里没有正确的答案,你只需要做对你的项目最有意义的事情。试着尽可能地解耦,是的,但有时你只是需要拥抱,完成工作

这取决于您对该类的使用情况

如果您需要从颜色类的实例中获取系统颜色类的实例(例如,如果您绘制到windows窗体),则最好使用系统类-它可以省去您在两种类型之间转换的工作量,并使您能够使用所有“功能”免费的颜色类(如“红色”、“黑色”、“绿色”等内置常量)

另一方面,如果您只是处理任意RGB值(可能用于科学计算),并且从不需要转换为System.Color实例,那么创建自己的类可能是有意义的


很可能您最好使用System.Color类-是的封装以及所有这一切都是一个好主意,但是不要以节省大量时间为代价!

您不必担心使用.NET核心库中的任何内容。没有它,编写DLL不会有多大进展。这是唯一需要小心的地方围绕着它的是System.Web名称空间,我相信.NET 4有一个客户端配置文件安装程序,这基本上意味着如果你使用这个安装程序,它只会安装预期在客户端上使用的东西。我个人认为这对微软来说是个坏主意,因为它只是为节省少量下载时间增加了不必要的复杂性。

I think在mscorlib中使用名称空间是可以接受的;除此之外,原则是合理的。我也喜欢你的原则,我将遵循它。到易失性依赖项的极好链接,通常是一个很好的答案。+1!感谢你提供了这些信息,其中包含了关于我甚至没有考虑过的问题的建议。我确定我想脱离WinFor我确实喜欢这个建议,它提醒我不要在课堂上依赖他人,再加上古斯的帖子(古斯原则),一般的建议似乎是“我自己滚”。由于颜色类微不足道,此操作过程最为有效。如Randolpho所述,在具有第三方依赖关系的更为复杂的情况下,这一原则可能必须改变,或以某种方式重新思考设计。感谢您的帖子!BCL代码在版本之间不会改变,但另一方面,可能会出现新的颜色类型-他们有:如果你依赖System.Drawing.Color,你将无法在WPF中使用你的API。呵呵,我喜欢“你只需要拥抱,完成工作”这个词.我认为在这种情况下,由于颜色类的相对琐碎性,我最好使用自己的颜色类。我看到更复杂的情况会带来麻烦。我99%确定我不需要内置常量,因此在这种情况下,我认为最好使用自己的颜色类。谢谢你的建议。