【问题标题】:Good naming for domain services layer [closed]域服务层的良好命名[关闭]
【发布时间】:2023-03-28 04:20:01
【问题描述】:

摘要

哪个名字比较好?

  • Domain.PersonService
  • DomainServices.PersonService
  • DomainServices.PersonDomainService(考虑一些更长的名字,比如PersonDomainServiceModelDecorator

还是别的什么?

情况

我们有一个框架,其中每一层都有一些基类。前任。存储库、域服务、UI 等

每个逻辑层都有一个名称,用作其命名空间:

  • “数据”用于包含存储库的数据层;前任。 Fx.Data.DbContextRepository
  • 域(非 Web)服务层的“服务”;前任。 Fx.Services.CrudService
  • Web UI 层的“Web.UI”;前任。 Fx.Web.UI.Controllers.CrudController

对于带有一些额外层的最终项目,我们也遵循相同的规则:

  • “数据”例如。 Project.Data.PersonRepository
  • “服务”例如。 Project.Services.PersonService
  • “Web.UI”例如。 Project.Web.UI.Controllers.PersonController
  • 代码优先实体的“实体”;前任。 Entities.Person
  • 对象模型的“模型”;前任。 Models.Person.Criteria,Models.Person.PersonDeleteModel

我的重点是“域服务”层,但也欢迎任何关于其他层的想法。

我们最终得出结论,“服务”不是“域服务”的合适名称,因为它可能会导致“Web 服务”或“域服务”层之间的歧义。

现在我们将“Services”命名空间更改为“Domain”或“DomainServices”。但我们还有另一个问题。我们为每个域服务类添加了“服务”后缀(例如PersonService)。现在有“DomainService”后缀(例如DomainServices.PersonDomainServerDomainServices.DomainPersonService)似乎很难看。

因此使用“域”作为命名空间会更漂亮,而类名表明它们是域命名空间下的服务(例如Domain.PersonService)。

【问题讨论】:

    标签: c# architecture naming domainservices


    【解决方案1】:

    您在您的项目中发现DomainDomainServices 之间有什么区别吗?如果您想将服务和其他域实体保留在单独的命名空间中,我相信您需要将 PersonService 移动到 DomainServices 命名空间。

    大多数时候我们不考虑命名空间,我们只提到类,这就是为什么我认为拥有DomainServices 命名空间很好。同时,如果您在整个应用程序中拥有单个域并且不打算将其分离,我认为最好将其称为 Domain.PersonService

    关于类名中的“Doman”一词,我真的不喜欢这样,因为它增加了名称的复杂性。您应该尝试以这种方式构建您的应用程序,以确保您打开 PersonService 您应该 100% 确定它是域服务。你知道打开PersonRepository的时候是Data层,domain也是一样。

    【讨论】:

      【解决方案2】:

      我会通过以下两种方式之一:

      1) 为什么没有Services 的子命名空间:

      • Services.Web 用于网络服务
      • Services.Domain 用于域服务

      另外,我会从 Web.UI 中删除 Web(前提是您只有基于 Web 的 UI)。

      2) 如果 Web 服务实际上存在于 Web 层中,它们可能位于 Web.Services 命名空间中,在这种情况下,Web.UI 也是可以接受的。域服务将简单地存在于 Services 命名空间中。

      【讨论】:

        【解决方案3】:

        我会提出两个简单的想法:

        1. 尝试定义全名(命名空间 + 类型名) 冗余(同名部分 - 域、人、服务、模型、 控制器,... - 尽可能不出现两次)

        2. 从 .NET 框架本身获得灵感。里面有more than 40000 classes!打开所有 .NET Reflector 或 ILSpy 等工具中的程序集并研究 仔细看看。

        我会想出这样的东西:

        Domain
         + Person
         + PersonService // Domain service
        Domain.Data
         + PersonRepository
        Domain.ServiceModel // WCF, etc. I chose the same namespace as .NET Framework
         + PersonService // Service implementation, this is really a service so "service" redundancy seems unavoidable here
        Domain.Web.UI
         + PersonController
        

        好吧,同样的类型名称在层次结构中出现多次是很不方便的。好吧,但这就是名称空间(和名称空间别名)也存在的原因。我认为这没什么大不了的。

        【讨论】:

          【解决方案4】:

          我的建议是把它写成 <Company>.<Component>.<SubComponent>.<Module>.DLL**。 Microsoft 在此链接 http://msdn.microsoft.com/en-us/library/vstudio/ms229048(v=vs.100).aspx 上推荐了类似的内容,例如 **Microsoft.Practices.EnterpriseLibrary.Security.Dll

          因此,您可能想选择Company.Domain.PersonService

          【讨论】:

            猜你喜欢
            • 2021-10-27
            • 2011-01-24
            • 2015-04-21
            • 1970-01-01
            • 1970-01-01
            • 2022-01-09
            • 1970-01-01
            • 1970-01-01
            • 2014-04-16
            相关资源
            最近更新 更多