2010-07-16 129 views
9

我在想这里,你们如何组织你的项目,在功能,范围等方面。组织C#项目的最佳方式是什么?

你有一个单元测试项目,一个项目的类库代码,一个项目的用户界面?

或者你只是将所有这些分成不同的文件夹?

我在想,通过项目分离这些东西比较容易,因为您的中央代码库位于一个地方,不需要直接引用UserInterface(无WinForms依赖项)或UnitTests。

有没有意见?

回答

13

我尝试将项目分成您可能称为“部署单元”的项目。换句话说,“我如何部署这些程序集?”

因为我显然没有部署单元测试,所以他们在自己的项目中。

然后,我将UI和“业务逻辑”划分为不同的项目。如果我保持这些分离线干净,我可以用新技术或基础结构替换我的UI层(认为WPF与ASP.NET),并且仍然重用两者的“业务逻辑”程序集。我只介绍一个理解业务逻辑接口的新UI层。

我也尝试为解决方案之间可能共享的代码保留一个单独的库。这将是我的数据访问实用程序,文件解析实用程序以及我在建立项目时反复使用的其他工具。我可以将这些程序集包含到我的新解决方案中,并获得我已经投入了时间的所有功能。

希望有所帮助。我已经参与了

2

在Stack Overflow和Google上进行一些搜索 - 还有其他人问过同一个问题。

一些注意事项:

Visual Studio中需要更长的时间来编译了许多项目,比单一的大项目的解决方案。不要过分细分您的解决方案。

微软的Composite Application Guidance有一个有趣的方式来划分项目。有一个基础设施项目,一个引导程序项目,然后为每个“模块”代码项目。

目前,我正在开发一个项目,将项目分开,就像您的示例一样:基础架构,业务逻辑,GUI和单元测试。

我更喜欢按目的组织文件,而不是类型。例如,我创建了名为“Communication”和“Interop”的文件夹,而不是“Events”和“Interfaces”。

1

你有单元测试 一个项目,为类库 代码一个项目,为用户界面一个项目?

非常多这个。通常保持UI精简并将任何业务逻辑移入其自己的项目中,每个业务逻辑项目都有一个测试项目。

0

我按照您所描述的按装配类型拆分项目。至少有可执行的主项目(如果它是一个应用程序)和一个或多个类库是很好的。如果它是一个Windows应用程序,绝对尽可能将代码与代码分开。 WPF应用程序在完成这一任务方面做得非常出色。

除此之外,我可以借用的一些其他建议绝对是收集一些第三方类库,并在代码重用明显或显而易见时编写自己的一些类库。

3

最后几个项目 - 我们结束了下面的结构(所有WPF棱镜项目):

xxx.Shell.Exe

xxx.yyyModule.dll(X 4- 7)

xxx.Tests

xxx.Model

xxx.Common

而对于那些使用WCF - 增加:

xxx.Backend

xxx.DataContracts

所有在一个解决方案(我们住与长期积累的时间...)将其分割成分离解决方案在重构时引入了太多问题。到目前为止 - 它对我们非常有用。

4

一些图案,我在一个解决方案中的项目组织发现有用:

我几乎总是有一个“共同”或“utils的”项目。这个项目应该只有很少的依赖关系,因此它可以很容易地在我的解决方案的任何地方(或可能在其他解决方案中)重新使用。你会惊讶地发现有多少小帮手将会进入这个项目。

我总是试图将我的业务逻辑分成一个项目(或更可能是一组项目),并将我的引导程序/提供程序代码放入不同的项目(或一组项目)中。我的引导程序/提供程序类是特定于上下文的(它们可以假定存在HttpContext或命令行参数等),但它们不包含业务逻辑。我的业务类实现业务逻辑,但不要假定存在或不存在任何特定于上下文的元素。这样,如果我最初将系统构建为控制台应用程序,我稍后可以编写一套windows-service引导程序/提供程序,并很快将其转换为Windows服务,对业务类别的影响极小或无影响。

与bootstrap/provider类相似,我也尝试将我的数据层与业务类隔离。但这是每个人都听过1000次的常见基本分离,所以它甚至不值一提。

许多系统的业务逻辑太复杂,不适合单个项目并保持一定程度的代码可维护性。因此,我通常会发现自己有多个业务逻辑项目,按功能区域(“客户管理”,“产品库存”等)进行分组。

+0

我也有一个utils文件夹,而不是一个项目。我在那里有班级图表,可重复的班级等。好的建议! – 2010-07-17 04:21:49

3

我去这样的事情在项目方面的解决方案中:

管理 - 通用文档,许可证的主副本,等我通常会也让这款编译成一个小的命令行“的自述“显示许可证,修订说明等的应用程序

数据 - 常规数据,如XML等。无可编译的代码。 LibraryN - 一个或多个库(通常为1-3:utils,core,扩展代码)。

Application1 ... ApplicationN - 应用程序(通常为一个)。

Test1 ... TestN - 测试。

在每个项目中,我将每个名称空间的文件保存在单独的文件夹中,子文件夹中的子名称空间等。我保留常见类型的内容,如文档,库或应用程序特定的数据,无论项目如何,都在具有相同名称的子文件夹中。

-Neil

1

如果你正在做一个UI业务十岁上下的应用程序,你应该看看MVC

当然,MVC只是一个普遍的概念,但它可以帮助您做出现在正在面临的那种决策。

WPF的MVC上有很多资源,您可能也可以直接将其应用于WinForms。

相关问题