繁体   English   中英

域驱动设计和自动映射器

[英]Domain Driven Design and Automapper

我在以下架构中有循环引用问题或SOLID Violation:

 MVC / WebAPI (Presentation Layer)
     - ViewModels
     - Automapper

ApplicationServices
    - AppServices

Domain
     - Services
     - Models (Business Layer)

Infra.Data
     - Repositories

我需要执行ViewModel和DTO之间的映射。 但是,我在MVC和Domain之间有一个引用(工作正常)。 映射应在最顶层即表示层中完成。 如何解耦,在不引用域的情况下在表示层中进行映射?

如果我将Automapper与Presentation层分离,则将有一个循环引用,因为它需要ViewModel,并且Presentation需要调用映射。

这取决于您如何定义界面。 它将告诉您需要在哪里进行映射

从表示层调用下一层时,您的代码必须像这样

 ISomeService MyService;//Resolve this with your favorite dependency injection fromwork

 var result = MyService.MySeriviceCall(Automapper.Map<SomeEntity>(fooDto));

在这里请注意,表示层取决于服务的接口(而不是实现)以及接口需要的所有内容。

如果您的界面看起来像这样

 interface SomeService(SomeEntity foo)

然后,您需要在表示层中进行映射。 但是请注意,要调用此服务,您已经需要了解域层,因为它是在界面中定义的。

但是,如果您的界面如下所示

interface SomeService(SomeDTo foo); 

然后,引用将从您的applicationService到您的域模型和表示层。 映射是在应用程序服务中完成的(我更喜欢的地方,现在您有了Dependency Inversion)。 注意:您可以将DTO放在一个单独的项目中,因此您只需要注意这些即可。

还要注意,定义映射和调用映射也可以解耦( https://github.com/AutoMapper/AutoMapper/wiki/Configuration

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM