我们目前拥有快速增长的C#代码库。目前我们有大约10个项目,分为通常的类别,common / util,网络层,数据库,ui组件/控件等。
我们遇到偶尔的循环依赖,其中项目x依赖于y中的某些内容,反之亦然。我们正在考虑将项目简化为一个,只使用结构文件夹/命名空间进行管理。我们有一个Java项目,当然只使用文件夹/包进行组织,所以我们不确定有多个项目带来的好处(如果有的话)。我们的项目都不需要特殊的项目属性,除了主要运行项目,我们可以将它们分开(并且非常薄)。
有没有人有任何先前的经验,为什么一个项目比多个项目更好/更差,并且可以提出最好的方法?而且循环依赖的任何问题在这两种方法中都很有用。
任何意见都赞赏。
答案 0 :(得分:23)
如果您的项目具有循环依赖性,则表明代码设计存在问题,而不是解决方案/项目模型。
答案 1 :(得分:17)
根据我的经验,如果你想
,在多个项目中创建单个可执行文件的代码可能很有用就个人而言,我的大多数决定都是基于第二点。我认为应用程序的一部分可能是我在其他应用程序中可能需要的更通用的库吗?把它放在一个单独的项目中。否则,正如您所指出的,拥有一个项目通常会使开发变得更容易。
关于循环依赖关系:推荐的解决方法是将引用的东西的 interfaces 放入第三个项目中。例如,如果您有两个应用程序都通过远程处理共享某些对象,则将共享对象的接口放在库项目中,以确保它们可供两个应用程序使用。
在不知道应用程序的确切设计的情况下,很难给出更具体的建议。
答案 2 :(得分:15)
在项目之间建立依赖关系时,总是将其视为“较低”,将另一个视为“较高”
更高级别的项目(例如Web界面)应该只依赖于较低的项目。较低的项目(例如实用程序)不应该依赖于更高的东西,例如Web界面。如果发生这种情况,则意味着您的更高级别的项目确实应该在较低的项目中,反之亦然。
答案 3 :(得分:8)
一般来说,拥有多个VS项目(在VS解决方案中)在这些情况下才有意义
如果你说你有循环依赖的问题,那么你的代码设计就会遇到问题。也许你可以将多个项目所使用的逻辑放在一个设计用于许多项目的类库中。
一般来说,如果你真的不需要,我会说你不应该添加更多的项目。拆分项目意味着增加更多的复杂性,所以当你这样做时,你应该从中获得合理的利益。
答案 4 :(得分:7)
我们注意到随着项目数量的增长,Visual Studio的性能会显着下降。对于包含大约12个C#项目的解决方案而言,从“调试”切换到“发布”配置这样简单的事情可能需要15秒。
此外,作为Reed关于构建时间的评论的反对点,我看到构建时间增长,因为Visual Studio似乎在项目开销上花费了大量时间。实际编译时间似乎很快,但是从命中构建到能够运行的总时间非常重要。
我的建议是将项目数量保持在最低限度。如果你有充分的理由需要多个项目,那么必要时使用它们,但更喜欢将它们放在一起。如有必要,您还可以重构将项目拆分为两个。
答案 5 :(得分:2)
将解决方案分成不同的项目(以及组件)有几个原因,主要归结为重新使用 y和职责分离。
现在你的目标应该是使一个程序集(也称为项目)对解决方案中的其他程序集具有最少量的依赖关系,否则你也可以在更少的程序集中拥有所有东西。例如,如果您的UI组件对您的数据访问代码有很强的依赖性,那么可能有些错误。
实际上,这归结为针对常见接口的编程。
注意但是:
当我说“否则你可能会把所有东西都装得更少”时,我并不一定暗示这是错误的。为了实现真正的关注点分离,您需要编写更多代码,并且必须更多地考虑您的设计。所有这些额外的工作对你来说可能不是很有益,所以仔细考虑一下。
答案 6 :(得分:1)
您可能会发现以下Martin文章值得:Design Principles and Design Patterns (PDF)(Java)。
C#中的修订版本特别适用于马丁的敏捷原则,模式和实践C#。
两者都表达了不同的指导方针,可以帮助您确定属于何处。然而,正如所指出的,循环依赖性表明存在设计问题或者某个组件属于不同组件。
答案 7 :(得分:0)
多个项目允许在多个应用程序中更好地重用特定类型。它还可以缩短构建时间,因为不需要为所有代码更改重建某些项目。
单个项目使生活更轻松,因为您不必担心依赖性。只是意识到轻松是有代价的 - 它也使得更容易让糟糕的设计决策蔓延到代码库中。无论是在一个项目还是多个项目中,循环依赖关系通常都是设计缺陷,而非要求。
答案 8 :(得分:0)
在我工作的地方,我们选择了一种方法,其目标是每个解决方案都有一个项目。所有代码库项目还具有测试工具应用程序和/或单元测试应用程序。
只要代码库通过测试,发布版本(当然使用Xml文档文件)就会转移到“Live”文件夹中。
任何需要这些其他项目功能的项目都必须从“实时”文件夹中引用它们。
优势非常明显。任何项目总是访问已知的工作代码。永远不可能引用正在进行的工作装配。每个程序集都会对代码进行测试,从而更容易理解bug的来源。更小的解决方案更易于管理。
希望这有帮助!
沙德
答案 9 :(得分:-1)
从单个项目开始。将代码库拆分为更多项目的唯一好处就是缩短构建时间。
当我有一些我真正希望与主项目隔离的可重用功能时,我会为它开始全新的解决方案。