1

我最近在尝试 Abp 框架,很高兴地发现它是 DDD 的一个很好的实现。但由于它使用 AutoMapper 将 DTO 转换为实体/聚合,我注意到它能够使我的私有聚合设置器短路,这显然违反了 DDD 的主要规则。虽然 AutoMapper 的目标是减少手动操作,但 DDD 通过私有 setter 强调不变量。

怎样才能把这两个看似矛盾的概念搞清楚,并顺利使用这个框架呢?这是否意味着我必须放弃 AutoMapper 以保持 DDD 原则,反之亦然?

我相信 AutoMapper 不是 DDD 的反模式,因为它在社区中非常流行。换句话说,如果 AutoMapper 可以使用反射(据我所知)来设置私有设置器,那么其他任何人都可以。这是否意味着私人二传手本质上是不安全的?

感谢任何人可以帮助我或给我一个提示。

4

3 回答 3

2

AutoMapper是:.NET 中基于约定的对象-对象映射器。

AutoMapper 本身并没有违反 DDD 的原则。可能是您使用它的方式。

怎样才能把这两个看似矛盾的概念搞清楚,并顺利使用这个框架呢?这是否意味着我必须放弃 AutoMapper 以保持 DDD 原则,反之亦然?

不,您不必放弃 AutoMapper。
您可以.IgnoreAllPropertiesWithAnInaccessibleSetter为每个地图指定。

相关:如何将 AutoMapper 配置为全局忽略所有具有不可访问 Setter(私有或受保护)的属性?

换句话说,如果 AutoMapper 可以使用反射(据我所知)来设置私有设置器,那么其他任何人都可以。这是否意味着私人二传手本质上是不安全的?

不,这意味着反射非常强大。

于 2020-04-05T11:48:59.313 回答
1

对Abp框架了解不多。私有设置器只是用于 DDD(封装)的古老传统 OOP。您应该从您的聚合中公开将更改其状态的公共方法。Automapper 可用于您的应用程序层,您可以将 DTO 映射到域构建块(如值对象),并将它们作为参数传递到您的聚合公共函数中,这些函数将更改其自身的状态并强制执行不变量。话虽如此,并不是每个人都喜欢 Automapper :)

于 2020-03-31T09:22:45.007 回答
0

怎样才能把这两个看似矛盾的概念搞清楚,并顺利使用这个框架呢?

通过配置 AutoMapper 的配置文件以使用使用聚合的工厂方法或构造函数的自定义表达式来构造聚合根。这是我的一个项目中的一个示例:

public class BphNomenclatureManagerApplicationAutoMapperProfile : Profile
{
    public BphNomenclatureManagerApplicationAutoMapperProfile()
    {
        CreateMap<BphCompany, BphCompanyDto>(MemberList.Destination);
        CreateMap<CreateUpdateBphCompanyDto, BphCompany>(MemberList.Destination)
            // invariants preserved by use of AR constructor:
            .ConstructUsing(dto => new BphCompany(
                dto.Id,
                dto.BphId,
                dto.Name,
                dto.VatIdNumber,
                dto.TradeRegisterNumber,
                dto.IsProducer
            ));
    }
}
于 2021-04-15T14:42:28.387 回答