【问题标题】:Using AutoMapper inside Onion Architecture在 Onion 架构中使用 AutoMapper
【发布时间】:2020-04-15 13:37:06
【问题描述】:

我们正在使用洋葱架构实现一个 aspnetcore Web api 应用程序。我有以下戒指:

  • 应用
  • 基础设施
  • 依赖解析器

到目前为止,我们已经设法将所有第三方实现保留在基础设施层,同时在我们需要该功能的较低环中插入通用接口。

但是,我们现在必须开始使用 AutoMapper,这就是我对如何实现它感到有点困惑的地方。在我们的应用程序中,我们需要映射器的最低环是应用程序环。这是包含所有 DTO 的环。在我看来,如果我们坚持这种架构,AutoMapper 的实现应该在基础设施层,然后我们可以注入它的 IMapper 接口,或者用更通用的接口包装该接口(只包含几个 Map(SourceT src, TargetT trg) 方法),进入内环。到目前为止一切都很好。当我想到映射配置时,困惑就来了。由于没有通用的方法来设置这个映射(CreateMap()),它似乎应该在基础设施层,但是,从逻辑上讲,如果我向应用程序环添加另一个 DTO,为什么我必须去基础设施层为它创建映射。配置似乎应该在应用程序环上,但在这种情况下,我将不得不依赖 Automapper。

有人对如何解决这个问题有任何建议,还是我看错了?

【问题讨论】:

    标签: .net asp.net-core automapper onion-architecture


    【解决方案1】:

    像 AutoMapper 这样的东西显然涉及两个不同的类,通常跨越应用层边界。例如,您可以将 DAL 层中的数据库实体映射到业务层中的 DTO 类。因此,该代码的位置就是这些边界相交的地方。

    例如,如果 Infrastructure 依赖于 Domain,并且您在 domain 和 Infrastructure 之间映射类,那么 AutoMapper 代码的位置就在 Infrastructure 中,因为这两个层都可用。同样,如果您的应用程序层中有一个视图模型,它是从基础设施层中的一个类映射的,那么 AutoMapper 代码的位置就在您的应用程序层中。同样,因为那是两层都参与的地方。

    有长有短,不止一个地方。每个层都应包含与该层相关的映射代码。

    【讨论】:

    • 我明白你在说什么,但是当你提到“映射代码”时,你是在谈论对象的映射(IMapper.Map())和映射配置(CreateMap)吗?您的方法是始终将这两者保持在一起吗?或者您是否在最高级别保留一个“配置文件”来为所有需要映射的对象创建映射。
    • 两者,实际的映射和配置,例如您创建的任何配置文件,是的,应该同时存在。同样,您需要两个类,因此它们必须存在于层边界,您不能将所有东西都塞进一层,因为并非所有东西都在这一层可用。
    • 这对我有用,但是,它仍然给我留下了我原来的问题。如果我需要在我的应用程序环中进行映射,我的应用程序环将需要依赖于 AutoMapper(第三方工具),因为我需要在那里创建映射配置文件。应用程序环不应依赖于基础设施环。
    • 否决这个问题,因为基础设施以外的任何层都不应该知道所涉及的技术。我同意@User20909
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多