Domain driven design AutoMapper模式是否违反DDD原则?

Domain driven design AutoMapper模式是否违反DDD原则?,domain-driven-design,automapper,abp,Domain Driven Design,Automapper,Abp,我最近在尝试Abp框架,并愉快地发现它是DDD的一个极好的实现。但由于它使用AutoMapper将DTO转换为实体/聚合,我注意到它能够短路聚合的私有setter,这显然违反了DDD的主要规则。虽然AutoMapper的目标是减少手动操作,但DDD强调通过私有设置器保持不变 我如何才能澄清这两个看似冲突的概念,并顺利使用该框架?这是否意味着我必须放弃AutoMapper以保持DDD原则,反之亦然 我相信AutoMapper不是DDD的反模式,因为它在社区中非常流行。换句话说,如果AutoMapp

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

我如何才能澄清这两个看似冲突的概念,并顺利使用该框架?这是否意味着我必须放弃AutoMapper以保持DDD原则,反之亦然

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


感谢所有能帮助我或给我提示的人。

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

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

是.NET中基于约定的对象映射器

就其本身而言,AutoMapper并不违反DDD原则。这可能是因为你如何使用它

我如何才能澄清这两个看似冲突的概念,并顺利使用该框架?这是否意味着我必须放弃AutoMapper以保持DDD原则,反之亦然

不,您不必放弃AutoMapper。
您可以使用AccessibleSetter为每个映射指定
.ignoreAllProperties

相关的:

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

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

是.NET中基于约定的对象映射器

就其本身而言,AutoMapper并不违反DDD原则。这可能是因为你如何使用它

我如何才能澄清这两个看似冲突的概念,并顺利使用该框架?这是否意味着我必须放弃AutoMapper以保持DDD原则,反之亦然

不,您不必放弃AutoMapper。
您可以使用AccessibleSetter为每个映射指定
.ignoreAllProperties

相关的:

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

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

我如何才能澄清这两个看似冲突的概念,并顺利使用该框架

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

公共类BPHnomeClatureManagerApplicationAutoMapperProfile:Profile
{
公共BphNomenclatureManagerApplicationAutoMapperProfile()
{
CreateMap(MemberList.Destination);
CreateMap(MemberList.Destination)
//使用AR构造函数保留的不变量:
.ConstructUsing(dto=>new BPH公司(
dto.Id,
dto.BphId,
dto.名称,
瓦蒂德努姆先生,
dto.TradeRegisterNumber,
dto.IsProducer
));
}
}
我如何才能澄清这两个看似冲突的概念,并顺利使用该框架

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

公共类BPHnomeClatureManagerApplicationAutoMapperProfile:Profile
{
公共BphNomenclatureManagerApplicationAutoMapperProfile()
{
CreateMap(MemberList.Destination);
CreateMap(MemberList.Destination)
//使用AR构造函数保留的不变量:
.ConstructUsing(dto=>new BPH公司(
dto.Id,
dto.BphId,
dto.名称,
瓦蒂德努姆先生,
dto.TradeRegisterNumber,
dto.IsProducer
));
}
}

为什么要将DTO转换为实体/聚合?来自客户的数据始终作为DTO上载,在验证后,当然必须将其转换为实体/聚合,无论使用何种方法,在这种情况下,翻译行为成为你的领域模型的实际行为,不可避免地导致领域模型的贫乏。如果你问我的话,那就没用了。谢谢,我理解你的建议。我还有一个问题:如果我有一个相对较大的聚合,并且它的大多数属性都是必需的,这是否意味着我必须创建一个具有长(我看到很难看)参数列表的构造函数?有什么优雅的方法来处理这个问题吗?取决于你们正在解决的问题。但是有很多选择——你可以输入字典,你可以使用生成器