【问题标题】:MVC - folders vs namespaces structure (C#)MVC - 文件夹与命名空间结构(C#)
【发布时间】:2016-10-21 03:39:09
【问题描述】:

在 C# 中使用 MVC 模式时的最佳实践是什么?我应该使用文件夹还是新的命名空间?使用命名空间时,我必须添加引用,哪个命名空间可以与另一个命名空间......这很好!

但是当使用命名空间并释放我的程序并检查 .exe 文件时,它会创建三个(模型、视图、控制器).exe 文件,它们必须位于同一文件夹中才能运行。

使用文件夹时,它们不相互依赖,这意味着我可以将“主”.exe 移动到一个文件夹,而不是移动所有三个 exe 文件,这样就可以了。

我会说拆分命名空间更好,因为您可以设置哪些类可以使用引用相互通信。但我不喜欢我必须在同一个文件夹中有三个 exe 文件才能运行它(命名空间样式)。

那么,什么是最佳实践+利弊?

查看屏幕截图以了解 Visual Studio 2015 中的差异: Different namespaces Folder structure

谢谢!

【问题讨论】:

  • 最佳实践是始终让命名空间和文件夹结构匹配。您的问题似乎是在问哪个更好,但答案是两者都需要。
  • 澄清一下:我应该将模型、视图、控制器作为命名空间中的文件夹,还是将模型、视图和控制器作为三个不同的命名空间?请看看我的打印屏幕。
  • 程序组织完全基于意见 - C#/.Net 几乎允许任何组织命名空间/文件夹/程序集的方式(例如,与 Java 不同)。随意设置它们以最适合您的项目。
  • 我认为您混淆了您的术语。我认为您将项目称为文件夹,假设您的问题是这种情况:我应该将我的模型视图和控制器分成不同的项目,还是在一个项目中分开文件夹。如果这是您想问的,请编辑您的问题。
  • 旁注:将 MVC 的每个组件构建成单独的可执行文件并在它们之间建立跨进程通信有点不寻常......通常一个会有主 exe 和一个或多个类库( DLL)。

标签: c# model-view-controller


【解决方案1】:

答案是 - 视情况而定。这取决于什么对您来说更容易理解,或者,如果您正在与其他人一起工作,那么对于所有使用此代码的程序员来说,什么更容易理解。

在 C# 中,您完全可以结合文件夹结构和命名空间来做所有事情。例如,您可以在SuperModels\ExtraModels\Models\Car.cs 中拥有类Car,而这个类可以在namespace MyProject.Controllers 中。这会非常奇怪,可能每个想要更改您的代码的人都会在他们的脑海中说出您的坏话(甚至大声说出来!),但它会起作用。

我在 ASP.NET 中使用 MVC 模式,并且默认项目结构与您的第二张屏幕截图一样,所以我(可能还有至少使用过 ASP.NET 一次的每个人)对此感到更舒服。但是,我看到项目中只有单独的类库项目用于模型,并且在带有控制器和视图的第二个项目中被引用。您可以接受的每一种方法都是好方法 - 没有正确项目结构之类的东西。

【讨论】:

    【解决方案2】:

    命名空间(和程序集)是编译器查找类的路径。

    文件和文件夹是人们寻找类的地方。

    我们希望所有内容保持整洁且易于查找,因此通常将文件夹/文件路径与命名空间路径匹配是最简单的。

    但是,

    有时将它们分开更容易处理。例如,为自动生成的 EF 实体的自定义部分类创建 MetaData 类 -

    • 您可以将 .edmx 保存在“DAL”文件夹中,
    • “模型”文件夹中的自定义部分类,
    • 以及“Models.MetaData”文件夹中的 MetaData 类

    部分类将位于同一命名空间“MyProject.Models”下,但位于不同的文件夹中,因此您可以轻松自定义它们,同时避免自动生成的类。

    您可以使用完全限定的类名将一个类链接到它的 MetaData 类。

    所以这将在 DAL 文件夹中;

    namespace MyProject.Models
    {
        public partial class Entity1
        {
            //Auto-generated code here - 
            //Don't touch so you don't lose it if auto-updates occur
    
            public string foo { get; set; }
        }    
    }
    

    这将在模型文件夹中;

    namespace MyProject.Models
    {
        [MetadataType(typeof(MyProject.Models.MetaData.Entity1Metadata))]
        public partial class Entity1
        {
        }    
    }
    

    虽然这将在 Models.MetaData 文件夹中;

    namespace MyProject.Models.MetaData
    {
        public class Entity1Metadata
        {
         [DisplayName("Foo Display Text")]
         public string foo { get; set; }
        }
    }
    

    我认为这比将所有内容放在一个“模型”文件夹中更好、更整洁。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2012-11-10
      • 2023-04-10
      相关资源
      最近更新 更多