【问题标题】:Organizing a large number of classes under a Namespace在命名空间下组织大量类
【发布时间】:2012-05-16 22:07:19
【问题描述】:

我们正在使用 Visual Studio 2010 将 Windows 应用程序转换为基于 .Net 的浏览器。虽然我对 .Net 并不陌生,但我对创建基于 3 层架构的应用程序很陌生。我想为我们数据库中的每个表创建类并将它们放在命名空间下。类名将与表名相同,因此命名空间中的每个类都将被引用,例如 CompanyName.ProductName.Entity.{table name}。现在回答我的问题:

这可行吗?

我会为每个表类创建单独的项目吗?请注意,随着更多程序的转换,将创建新的表类。

这会创建一个巨大的 .dll 吗?

其他开发人员如何访问我创建的类,它们存储在哪里以便我可以使用 Using 指令引用这些类?

【问题讨论】:

    标签: namespaces


    【解决方案1】:

    始终使用单独的 cs 文件创建类名,因此很容易对文件进行版本控制。如果我们将类保存在单个文件或多个文件中,它与 dll 的大小无关。

    在您的解决方案中创建像 Project > ProductName > Classes 这样的文件夹结构。

    【讨论】:

    • 听起来你在说我应该在 VS 中创建一个名为 My Entities 的项目,然后根据需要添加包含每个新表类的新文件夹,从而创建一个 .dll。这是正确的做法吗?
    • 会有一个特定于实体的文件夹,其中包含与该实体相关的所有类。
    【解决方案2】:
    1. 是否要为每个表类创建单独的项目?
      不,不要为每个表类创建单独的项目。这太细了。
    2. 这会创建一个巨大的 .dll 吗? 默认情况下,每个项目都会创建一个单独的 DLL(我相信您可以使用 IL 合并来更改它。)但是,每个命名空间与 DLL 没有直接关系。也就是说,您可以在一个 DLL 中拥有多个命名空间。

    我们通常所做的是创建一个 DAL 库。这将是它自己的项目,通常命名为 ProductName.Data 之类的名称,然后在其中我们可能有一个名称空间,例如 ProductName.Data.ModelsProductName.Data.Repositories

    命名空间主要用于帮助您组织代码。他们还帮助编译器。例如,如果您有一个名为 Users 的数据库类,并且它位于 XYZ.Data 中,那么如果它位于单独的命名空间中,您仍然可以拥有一个名为 Users 的视图模型,例如XYZ.ViewModels.

    我们所做的另一件事是在同一产品的 DLL 中保持根命名空间相同。所以我们最近在XYZ.Data 中有我们的数据库。然后我们将应用程序特定的逻辑放在一个单独的 DLL 中并将其命名为 XYZ.AppLogic 我们还在命名空间 XYZ.ViewModels 中有视图模型。

    我不认为有任何硬性/快速规则限制您拥有的命名空间数量。默认情况下,Studio 会尝试为项目中的每个文件夹创建一个新的命名空间。也就是说,我经常尝试避免命名空间过载,因为我不想在我的文件顶部看到这样的内容:

    using XYZ.Data.Models.Accounts;
    using XYZ.Data.Models.Users;
    using XYZ.AppLogic.Authentication;
    using XYZ.AppLogic.Users;
    using XYZ.AppLogic.Settings;
    using XYZ.ViewModels.UserPreferences;
    

    不过,这更多的是个人喜好。

    编辑解决方案视图

    • 我的解决方案
      • MyProj.数据
        • 型号
          • User.cs
          • Account.cs
          • Settings.cs
      • 存储库
        • UserRepository.cs
        • AccountRepository.cs

    User.cs 是我定义表的 POCO(Plain Ol' CLR Object)。

    Repository 文件夹包含特定于我的 ORM(我正在使用 PetaPoco)的东西,这让我可以实际访问我的用户数据。

    例如,我的 UserRepository 可能有一个方法

    public User GetById(int id)
    {
       var db = new Database(<myConnectionStringName>);
       return db.SingleOrDefault<User>(id);
    }
    

    该语法特定于 PetaPoco,但它是我将数据对象与实际数据库连接分开的方式。

    【讨论】:

    • 我将数据库中的所有表都称为实体,但我在您对 DAL 库的引用中看到了您的观点。我想将我的所有表分组在一个命名空间下,比如 MyNamingConvention.Entities。到目前为止,听起来我创建了一个可以容纳我所有课程的项目。至于如何在该项目中组织它们是我迷失的地方。如果我在解决方案资源管理器中右键单击项目名称,是在新文件夹中添加一个文件然后是一个新类,还是继续添加具有相同命名空间声明的类?
    • 我可能错误地使用了项目这个词 - 也许我应该说解决方案?
    • 是的,为每个表添加一个新文件。否则文件会很快变得笨拙。我通常有一个 Models 文件夹,然后是一个 Repository 文件夹或类似的东西,它实际上可以让数据库工作。
    • 那么您的模型文件夹对于每个表类都有一个子文件夹?您指的数据库工作是什么 - 连接?
    • 没有我的模型文件夹每个模型都有一个 cs 文件。我会更新我的答案。
    【解决方案3】:

    我一直在寻找的简单答案是使用我的命名空间作为默认命名空间创建一个解决方案。对于每个文件,创建一个新类,并在每个文件中指定名称空间。感谢所有回复的人。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多