C# 如何在严格的分层体系结构中分离层,并在不造成不必要冗余的情况下促进模块化? 我已经开始着手为我公司的代码库建立一个新的架构的基础。这项倡议的动力是: 我们的代码库已经有十多年的历史了,当我们试图扩展时,代码库终于崩溃了 顶层的“层”,如果你想这样称呼它们的话,就是一堆经典的ASP和.NET 我们的数据库充满了一堆邪恶的存储过程,其中包含数千行业务逻辑和验证 以前的开发人员创建了“聪明”的解决方案,这些解决方案不可扩展、不可重用,并且表现出非常明显的反模式;这些需要在短时间内弃用

C# 如何在严格的分层体系结构中分离层,并在不造成不必要冗余的情况下促进模块化? 我已经开始着手为我公司的代码库建立一个新的架构的基础。这项倡议的动力是: 我们的代码库已经有十多年的历史了,当我们试图扩展时,代码库终于崩溃了 顶层的“层”,如果你想这样称呼它们的话,就是一堆经典的ASP和.NET 我们的数据库充满了一堆邪恶的存储过程,其中包含数千行业务逻辑和验证 以前的开发人员创建了“聪明”的解决方案,这些解决方案不可扩展、不可重用,并且表现出非常明显的反模式;这些需要在短时间内弃用,c#,.net,architecture,C#,.net,Architecture,在我进行初始设计时,我一直在大量地引用这些技术,但在我做出任何承诺之前,我仍然有一些挥之不去的问题。在我进入问题之前,以下是我到目前为止对体系结构的了解: (高级别) (深入的业务和数据层) 这些图表基本上显示了我打算如何将每个层分解为多个组件。所以在这个候选架构中,我们有11个程序集,不包括最顶层 以下是每个组件的详细说明: Company.Project.Common.OperationalManagement:包含实现异常处理策略、日志记录、性能计数器、配置和跟踪的组件 Compan

在我进行初始设计时,我一直在大量地引用这些技术,但在我做出任何承诺之前,我仍然有一些挥之不去的问题。在我进入问题之前,以下是我到目前为止对体系结构的了解:

(高级别)

(深入的业务和数据层)

这些图表基本上显示了我打算如何将每个层分解为多个组件。所以在这个候选架构中,我们有11个程序集,不包括最顶层

以下是每个组件的详细说明:

  • Company.Project.Common.OperationalManagement
    :包含实现异常处理策略、日志记录、性能计数器、配置和跟踪的组件
  • Company.Project.Common.Security
    :包含执行身份验证、授权和验证的组件
  • Company.Project.Common.Communication
    :包含可用于与其他服务和应用程序通信的组件(基本上是一组可重用的WCF客户端)
  • Company.Project.Business.Interfaces
    :包含用于从高层与业务层交互的接口和抽象类
  • Company.Project.Business.Workflows
    :包含与创建和维护业务工作流相关的组件和逻辑
  • Company.Project.Business.Components
    :包含封装业务规则和验证的组件
  • Company.Project.Business.Entities
    :包含代表高层业务实体的数据对象。其中一些可能是唯一的,一些可能是由来自数据层的更细粒度数据实体形成的复合物
  • Company.Project.Data.Interfaces
    :包含用于以存储库样式与数据访问层交互的接口和抽象类
  • Company.Project.Data.ServiceGateways
    :包含用于调用外部系统并从外部系统获取数据的服务客户端和组件
  • Company.Project.Data.Components
    :包含用于与数据库通信的组件
  • Company.Project.Data.Entities
    :包含更细粒度的实体,这些实体在较低级别上表示业务数据,适合以事务方式持久化到数据库或其他数据源
我的意图是,这应该是一个严格的分层设计(一个层只能与它正下方的层通信),层的模块化分解应该促进高内聚和松耦合。但我还是有些担心。以下是我的问题,我觉得这些问题足够客观,因此它们在这里是合适的

  • 我对每个模块及其各自程序集的命名约定是否遵循标准约定,或者我是否应该采用不同的方式进行命名
  • 将业务层和数据层拆分为多个程序集是否有益
  • 在各自的程序集中为每个层提供接口和抽象类是否有益
  • 最重要的是-为业务层和数据层提供“实体”组件是否有益?我在这里担心的是,如果您在数据访问组件中包含将由LINQ to SQL生成的类,那么给定的实体将在代码库中的三个不同位置表示。很明显,像AutoMapper这样的工具可能会有所帮助,但我仍然不是100%。我将它们像这样分开的原因是A-强制执行严格的分层体系结构,B-促进层之间更松散的耦合,并在每个实体后面的业务领域发生变化时将破坏最小化。然而,我想从那些在建筑方面比我经验丰富得多的人那里得到一些指导
  • 如果你能回答我的问题或给我指出正确的方向,我将不胜感激。谢谢


    编辑:
    在阅读了狒狒的答案之后,我想加入一些似乎更相关的额外细节。数据库表也是一团混乱,充其量是准关系的。但是,我不允许完全重新构建数据库并进行数据清理:我能做的最远的事情就是创建新的存储过程并开始弃用旧的过程。这就是为什么我倾向于在数据层中显式定义实体——尝试使用LINQ to SQL(或任何其他ORM)生成的类作为数据实体似乎不可行。

    我实际上刚刚开始做同样的事情,所以希望这将有助于或至少生成更多注释,甚至对我自己也有帮助:)

    1。我对每个模块及其各自程序集的命名约定是否遵循标准约定,或者我应该采用不同的方式进行命名?

    据报道,这似乎没问题。他们将其列为:

    (|)[.][.]

    例如,Microsoft.WindowsMobile.DirectX。