.NET Core 开发实战

14 篇文章 2 订阅
5 篇文章 1 订阅

.NET Core 开发实战

2.1 工程结构概览:定义应用分层及依赖关系

分层

• 领域模型层
• 基础设施层
• 应用层
• 共享层

总结

• 领域模型专注业务的设计,不依赖仓储等基础设施层
• 基础设施的仓储层仅负责领域模型的取出和存储
• 使用 CQRS 模式设计应用层
• Web API 是面向前端的交互的接口,避免依赖领域模型
• 将共享代码设计为共享包,使用私有 NuGet 仓库分发管理

应用层<=基础设施层<=领域模型层<=领域模型抽象层 应用层<=基础设施的核心层<=领域模型抽象层 共享层用NuGet引入
领域模型层:实现聚合,领域事件,领域模型 基础设施层:实现仓储Repository,Context的配置,还有注册领域模型与数据库的映射关系

在这里插入图片描述

Application下的IntegrationEvents,是用来处理 不同领域间
的事件传递,这个订阅类是应该放在与发布类同样的项目中吗?然后在订阅类中去调用其他微服务的接口进行处理。只所以用CAP组件,是因为该中间件提供了保证事务的同步,保证数据的最终一致性机制,这么理解没问题吧?

2.2 定义 Entity:区分领域模型的内在逻辑和外在行为

要点

• 将领域模型字段的修改设置为私有
• 使用构造函数表示对象的创建
• 使用具有业务含义的动作来操作模型字段
• 领域模型负责对自己数据的处理
• 领域服务或命令处理者负责调用领域模型业务动作

实现值对象
在这里插入图片描述
图 7-13。Order 聚合中的地址值对象

如图 7-13 所示,一个实体通常由多个属性组成。例如,Order实体可以建模为具有身份的实体,并在内部由一组属性组成,如 OrderId、OrderDate、OrderItems 等。但是地址,它只是一个由国家/地区、街道组成的简单的复值,城市等,并且在该域中没有身份,必须建模并视为值对象。

值对象的重要特征

值对象有两个主要特征:

  • 他们没有身份。
  • 它们是不可变的。

第一个特征已经讨论过了。不变性是一个重要的要求。值对象的值在对象创建后必须是不可变的。因此,在构造对象时,您必须提供所需的值,但不能允许它们在对象的生命周期内更改。

值对象允许您执行某些技巧来提高性能,这要归功于它们的不可变特性。在可能有数千个值对象实例的系统中尤其如此,其中许多具有相同的值。它们不可变的性质允许它们被重用;它们可以是可互换的对象,因为它们的值是相同的并且它们没有身份。这种类型的优化有时会在运行缓慢的软件和性能良好的软件之间产生差异。当然,所有这些情况都取决于应用程序环境和部署上下文。

C#中的值对象实现

在实现方面,您可以拥有一个具有基本实用方法的值对象基类,例如基于所有属性之间比较的相等性(因为值对象不能基于身份)和其他基本特征。以下示例显示了在来自 eShopOnContainers 的订购微服务中使用的值对象基类。

public abstract class ValueObject
{
    protected static bool EqualOperator(ValueObject left, ValueObject right)
    {
        if (ReferenceEquals(left, null) ^ ReferenceEquals(right, null))
        {
            return false;
        }
        return ReferenceEquals(left, null) || left.Equals(right);
    }

    protected static bool NotEqualOperator(ValueObject left, ValueObject right)
    {
        return !(EqualOperator(left, right));
    }

    protected abstract IEnumerable<object> GetEqualityComponents();

    public override bool Equals(object obj)
    {
        if (obj == null || obj.GetType() != GetType())
        {
            return false;
        }

        var other = (ValueObject)obj;

        return this.GetEqualityComponents().SequenceEqual(other.GetEqualityComponents());
    }

    public override int GetHashCode()
    {
        return GetEqualityComponents()
            .Select(x => x != null ? x.GetHashCode() : 0)
            .Aggregate((x, y) => x ^ y);
    }
    // Other utility methods
}

您可以在实现实际值对象时使用此类,如Address以下示例中所示的值对象:

public class Address : ValueObject
{
    public String Street { get; private set; }
    public String City { get; private set; }
    public String State { get; private set; }
    public String Country { get; private set; }
    public String ZipCode { get; private set; }

    public Address() { }

    public Address(string street, string city, string state, string country, string zipcode)
    {
        Street = street;
        City = city;
        State = state;
        Country = country;
        ZipCode = zipcode;
    }

    protected override IEnumerable<object> GetEqualityComponents()
    {
        // Using a yield return statement to return each element one at a time
        yield return Street;
        yield return City;
        yield return State;
        yield return Country;
        yield return ZipCode;
    }
}

这个值对象实现Address没有标识,因此在Address类定义或ValueObject类定义中都没有为它定义 ID 字段。

2.3 工作单元模式(UnitOfWork):管理好你的事务

特性
• 使用同一上下文
• 跟踪实体的状态
• 保障事务一致性

2.4 定义仓储:使用 EF Core 实现仓储层

2.5 领域事件:提升业务内聚,实现模块解耦

总结
• 由领域模型内部创建事件
• 由专有的领域事件处理类处理领域事件
• 根据实际情况来决定是否在同一事务中处理(如一致性、性能等因素)

2.6 APIController:定义 API 的最佳实践

总结
• 负责用户的输入输出定义
• 负责身份认证与授权
• 与领域服务职责区分开,不承载业务逻辑

2.7 集成事件:解决跨微服务的最终一致性

集成事件工作原理
在这里插入图片描述
总结
• 集成事件是跨服务的领域事件
• 集成事件一般由领域事件驱动触发
• 不通过事务来处理集成事件(实现最终一致性)
• 仅在必要的情况下定义和使用集成事件

2.8 集成事件:使用 RabbitMQ 来实现 EventBus

实现原理
• 事件表
• 事务控制

2.9 MediatR:轻松实现命令查询职责分离模式(CQRS)

核心对象
• IMediator
• IRequest、 IRequest
• IRequestHandler<in TRequest, TResponse>

2.10 MediatR:让领域事件处理更加优雅

核心对象
• IMediator
• INotification
• INotificationHandler

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值