C# 一个大中型项目的结构

C# 一个大中型项目的结构,c#,class,namespaces,C#,Class,Namespaces,我是一个初学者程序员,为我的愚蠢道歉 我来自python背景,只创建了几个类的小项目,大部分时间我都将所有代码放在一个文件中 我最近一直在学习c语言,我正在编写一个相当大的控制台应用程序(10000行以上)。很明显,我不能将所有内容都放在一个文件中,但我不确定如何将项目分割成更小的部分 到目前为止,我所采用的方法是为解决方案中的每个名称空间创建一个新项目,并相应地将每个类拆分为一个单独的文件。到目前为止,我有大约四个名称空间。我独立编写了每个名称空间,以期在其他项目中使用每个名称空间 我现在正处

我是一个初学者程序员,为我的愚蠢道歉

我来自python背景,只创建了几个类的小项目,大部分时间我都将所有代码放在一个文件中

我最近一直在学习c语言,我正在编写一个相当大的控制台应用程序(10000行以上)。很明显,我不能将所有内容都放在一个文件中,但我不确定如何将项目分割成更小的部分

到目前为止,我所采用的方法是为解决方案中的每个名称空间创建一个新项目,并相应地将每个类拆分为一个单独的文件。到目前为止,我有大约四个名称空间。我独立编写了每个名称空间,以期在其他项目中使用每个名称空间

我现在正处于将每个名称空间拼凑起来以构建控制台应用程序的阶段。我该怎么做呢

此外,我是否以正确的方式构建代码

另外+1,是否可以在项目中使用位于完全不同目录中的文件


非常感谢

我将从最后一个问题开始到第一个问题。您可以使用位于项目中完全不同目录中的文件。我想你走对了。关于不同的名称空间,您可以使用以下代码

using System;
using namespace1; 
using namespace2;

听起来或多或少是对的。解决您的问题/结构:

1) 不需要让每个唯一的名称空间由它自己的项目表示;如果有助于组织类,则可以(而且可能应该)在同一项目中拥有多个子名称空间。在您的例子中,听起来好像每一个都被编程为自己的独立组件,因此为每一个编写一个项目是有意义的

2) 将每个类拆分为单独的文件很好,请继续这样做

3) 不知道你在问什么关于拼凑你的代码。您的意思是如何在VisualStudio或最佳实践中实际引用/链接项目,以编写/访问API?如果是前者,您可以右键单击项目下的“引用”项并指向该项目(而不是其编译的DLL)。如果是后者,您可以遵循多种编程模式,但通常您希望从项目中抽象出一个好的API,这样您就不必关心代码的内部工作

4) 您完全可以引用来自完全不同目录的文件。只需右键单击项目或文件夹,选择“添加->现有项”,然后浏览到该文件。您可能希望将其添加为“链接”,这样它就不会实际复制文件:


这里还有一个StackOverflow问题,它涉及到可能的解决方案结构:

当您从名称空间开始时,通常会使用您的公司或组织名称(例如,“a”)。如果您有多个产品/项目,并且正在为该项目创建代码,那么您需要添加一个限定符(比如“B”、“C”等,这样您就有了a.B、a.C等)

然后,一般的方法是将相关的命名空间中的类型分组在一起。如果您创建了一个类型,并且它是针对常见问题的通用/实用/一次性解决方案,那么您将希望将其保留在范围更广的命名空间中。当您发现要创建许多类型来支持某些功能或用途时,您可能希望创建一个狭窄的命名空间来包含这些类型。例如,假设您需要为A.B编写几个数据访问组件,其中包含数据传输对象、数据访问对象等。然后,您可能希望将这些类型放入类似A.B.DataAccess的内容中

但是,请记住.NET使用OOP范例。一个OOP范例是代码重用。因此,如果您同时访问A.B和A.C中的数据,那么您最好创建可重用的数据访问组件,以鼓励在这两个项目中重用代码。在这种情况下,您可能希望有一个项目,例如a.Common,它包含您的任何产品使用的公共类型,其中包含可在a.B、a.C等中使用的通用、通用或抽象概念

让我试着用这个例子更进一步

  • 项目:A.通用(组件名称)
  • 用途:用于任何项目的可重用类型
  • 名称空间:A,A.DataAccess
  • 类型:A.DataAccess.DataAccessObjectBase

  • 项目:A.B(组件名称)
  • 用途:产品“B”的类型
  • 参考文献:A.Commmon
  • 名称空间:A、A.B、A.B.DataAccess
  • 类型:A.B.DataAccess.DataAccessObject(实现A.DataAccess.DataAccessObjectBase)

  • 项目:A.C(组件名称)
  • 用途:产品“C”的类型
  • 参考文献:A.普通
  • 名称空间:A、A.C、A.C.DataAccess
  • 类型:A.C.DataAccess.DataAccessObject(实现A.DataAccess.DataAccessObjectBase)
这是一个非常简单和粗糙的示例,但希望它能帮助您可视化程序集和名称空间之间的关系

其他一些提示:

  • 不要过度创建名称空间,尤其是在创建深层名称空间(如A.B.Something.SomeMoreStuff.EvenMoreStuff)时,除非它是合理的。这让你更难找到东西
  • 名称空间应该从更广泛的用途扩展到更狭窄的用途。此外,如果您在一个更窄的名称空间中创建了一个严重依赖于更宽名称空间中的内容的类型,请确保将其放在更宽的名称空间下。e、 g.A.B.更宽。更窄

最后,您应该继续为每个源文件只创建一种类型。

名称空间可以帮助您组织代码并提供。也可以通过创建文件夹或单独的项目来完成。通过良好的逻辑分离,您可以构建可维护和可扩展的应用程序

当您决定是否创建新文件夹或新项目时,您应该依靠常识。例如,为hello world应用程序i创建几个项目
FooCompany.BLL
FooCOmpany.DAL
FooCOmpany.UI
// Assembly for business logic
Foo.Bar.Domain
Foo.Bar.Domain.Model
Foo.Bar.Domain.Services
Foo.Bar.Domain.Repositories
// Assembly for data access
Foo.Bar.Persistence.NHibernate 
// Assembly for application services
Foo.Bar.Services
// Project for presentation    
Foo.Bar.Presentation.Web
Foo.Bar.Presentation.Web.Controllers
Foo.Bar.Presentation.Web.Views