当前位置: 首页 > news >正文

C# 中充血模型和‌贫血模型

在C#中,‌充血模型(Rich Domain Model)‌和‌贫血模型(Anemic Domain Model)‌是两种截然不同的领域建模方式,核心区别在于‌业务逻辑的归属‌。以下是通俗易懂的解释:

1. ‌贫血模型(Anemic Domain Model)‌

  • 定义‌:领域对象(如Customer、Order类)仅包含数据(属性),‌不包含业务逻辑‌,所有业务逻辑被抽离到外部的“服务层”(如CustomerService、OrderService)
  • 代码示例‌:
// 贫血的Customer类:只有数据,没有行为
public class Customer
{
    public string Name { get; set; }
    public decimal Balance { get; set; }
}

// 业务逻辑放在外部的Service类
public class CustomerService
{
    public void DeductBalance(Customer customer, decimal amount)
    {
        if (customer.Balance >= amount)
            customer.Balance -= amount;
        else
            throw new InsufficientBalanceException();
    }
}
  • 优点‌:
    结构简单,适合‌CRUD操作‌。
    易于与ORM(如Entity Framework)配合使用。
  • 缺点‌:
    业务逻辑分散在服务层,‌领域对象失去自治性‌,容易退化为“数据容器”。
    违反面向对象设计的‌封装原则‌,可能导致代码冗余和难以维护。

2. ‌充血模型(Rich Domain Model)‌

  • 定义‌:领域对象不仅包含数据,‌还封装了与自身相关的业务逻辑‌,对象的行为和状态紧密结合。
  • 代码示例‌:
// 充血的Customer类:数据和行为内聚
public class Customer
{
    public string Name { get; private set; }
    public decimal Balance { get; private set; }

    public void DeductBalance(decimal amount)
    {
        if (Balance >= amount)
            Balance -= amount;
        else
            throw new InsufficientBalanceException();
    }

    // 其他业务方法(如Validate、ApplyDiscount等)也封装在此
}
  • 优点‌:
    ‌高内聚‌:对象自我管理状态和规则,符合面向对象设计原则,充血模型使得领域对象真正具有了行为和状态,更符合面向对象编程中对象的职责完整性。对象能够自我管理和执行与自身相关的操作,提高了对象的封装性和内聚性。
    例如,用户对象可以自己完成登录和注册操作,就像一个真正的 “用户” 实体在系统中能够进行自我操作一样。
    业务逻辑集中,‌更易维护和扩展‌,适合复杂领域。
  • 缺点‌:
    需要更严格的设计,可能增加类的复杂度;
    对开发人员要求较高:开发人员需要对领域知识和面向对象设计有更深入的理解,才能合理地将业务逻辑封装到领域对象中。
    否则,可能会出现业务逻辑封装混乱、对象职责划分不明确等问题,影响系统的质量和可维护性。
    ORM映射时可能需要额外处理(如绕过构造函数或属性封装)。

3. ‌关键对比‌

‌维度‌‌ 贫血模型‌‌ ‌充血模型‌
业务逻辑位置‌ 服务层(如XXXService类)‌ 领域对象内部(如Customer类)
对象职责‌ 仅保存数据‌ 数据 + 行为
适用场景‌ 简单CRUD或高吞吐量场景‌‌ 复杂业务逻辑(如金融、电商)
面向对象契合度‌ 低(更像过程式编程)‌ 高(符合封装、自治原则)
数据库交互频率‌ 更低(服务层可批量处理)‌‌ 可能更高(因逻辑内聚触发多次操作)

4. ‌如何选择?‌

  • 选贫血模型‌: 业务简单、以数据操作为主(如管理后台),或团队对面向对象设计经验不足。
  • 选充血模型‌: 业务复杂、需要长期维护(如电商、金融系统),且团队具备领域驱动设计(DDD)经验。

5. ‌实际应用提示‌

  • 混合使用‌:实践中可以部分充血。例如,核心领域对象(如Order)用充血模型,辅助对象(如DTO)用贫血模型。
  • ‌避免教条‌:无论选择哪种模型,‌保持代码一致性和可维护性‌是关键。

通过理解这两种模式,你可以更清晰地设计出符合业务需求的C#领域模型。

http://www.dtcms.com/a/106832.html

相关文章:

  • 从查重报告入手的精准论文降重秘籍
  • 基于 Spring Cloud 与 Spring Boot 的工程项目管理系统源码:重塑工程管理新范式​
  • 文件实时备份软件PanguFlow
  • zabbix监控网站(nginx、redis、mysql)
  • 在openharmony中编译部署早期vi工具(附带vi工具源码)
  • 生产管理系统如何破解汽车零部件行业追溯难痛点
  • (Kotlin) Android使用DialogX实现iOS风格底部弹窗(带Toggle开关)
  • 算法与数据结构面试题
  • 【硬件视界8】电源供应器(PSU):计算机的“心脏“
  • 洛谷题单3-P5720 【深基4.例4】一尺之棰-python-流程图重构
  • Tomcat 部署 Jenkins.war 详细教程(含常见问题解决)
  • 存储型XSS漏洞解析
  • springBoot统一响应类型3.5.2版本
  • 【橘子大模型】关于PromptTemplate
  • 定制化管理系统与通用管理系统,谁更胜一筹?
  • MySQL的进阶语法7(索引-B+Tree 、Hash、聚集索引 、二级索引(回表查询)、索引的使用及设计原则
  • ES6对函数参数的新设计
  • 贪心算法,其优缺点是什么?
  • 第二篇:系统分析师——1-6章
  • 深入解析 Spring Boot 测试核心注解
  • 使用UDP建立连接,会存在什么问题?
  • es使用ik分词器并自定义中文词库实现热更新
  • 软件工程13 条法则
  • 空调开机启动后发出噼里啪啦的异响分析与解决
  • C语言--字符串逆序
  • Timer的底层实现原理?
  • LETTERS(DFS)
  • Java 递归全解析:从原理到优化的实战指南
  • Elasticsearch 正排索引
  • 内网环境将nginx的http改完https访问