【问题标题】:Configuring mapping behavior that's non-framework specific配置非特定于框架的映射行为
【发布时间】:2013-03-06 18:37:25
【问题描述】:

我正在尝试配置我的对象映射器,但不知道我正在使用哪个映射器。 :/

这听起来可能有点奇怪。这样做的原因是我正在尝试洋葱架构,因此我的 UI 无法了解位于我的基础架构中的对象映射器。示例见this solution

我在弄清楚我应该如何“委托”非默认映射行为时遇到了一些麻烦。 像这样的东西:

Mapper
    .CreateMap<MyModel, MyDestViewModel>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

我在我的 MVC 项目中设置了一个从 Global.asax 调用的类,这是我要配置映射的地方。

public static class MapConfig
{
    public static void RegisterMaps()
    {

    }
}

我在想我可以做如下的事情。 (IMapper是位于Domain中的自定义接口)

public static void RegisterMaps(HttpConfiguration config)
{
    var mapper = config.DependencyResolver.GetService(IMapper);
    mapper.CreateMap<MyModel, MyViewModel>();
}

现在...我将如何设置像 .ForMember 这样的特殊行为?请记住,它不能特定于 AutoMapper。

我在想一些类似mapper.CreateMap&lt;MyModel, MyViewModel&gt;(Expression&lt;Func&lt;T&gt;&gt;) 的事情,Func 会做一些我现在无法弄清楚的黑魔法:( - 我是在正确的道路上还是我错过了一些重要的事情?

【问题讨论】:

    标签: dependency-injection automapper onion-architecture


    【解决方案1】:

    洋葱架构不是关于配置与实现无关,而是关于执行

    只需要创建一个IMapper接口来执行映射,不用担心配置。这适用于您的 ORM、IoC 容器和其他一切。

    此外,洋葱架构与项目结构无关,它与依赖项的方向有关。只需在您的 UI 中调用 CreateMap。然后,您可以在 Core 中一直定义一个 IMapper 接口,其他部分实现一个委托给 AutoMapper 的版本。

    【讨论】:

    • 如果我误解了你,我很抱歉。但是我应该只创建一个 IMapper,它与 AutoMapper 中所需的功能进行 1:1 映射?
    • 是,但没有 CreateMap 调用。只有 Map 调用。这就像抽象您的 ORM 配置一样,这是不明智的。
    • 对,所以我几乎只是来自 IMappingEngine 的 c/p。也许当我更熟悉它时,这个lostechies.com/jimmybogard/2009/05/12/automapper-and-ioc 会开始变得更有意义:)
    【解决方案2】:

    您正在抽象出有用的功能,这将花费您比您最初意识到的更多的时间。为什么不花时间选择一个映射器并坚持下去呢?

    为什么您的 UI 不了解您的映射器如此重要?假设您使用的是 MVC,那么您将使用很多您选择的映射器功能来将我们的域模型展平以查看模型。

    这与人们使用通用存储库实现“以防万一”他们决定在项目中切换 ORM 的情况相同。

    仔细选择您的基础架构并坚持下去。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2013-01-21
      • 1970-01-01
      • 2010-11-18
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多