配置非框架特定的映射行为

时间:2013-03-06 18:37:25

标签: dependency-injection automapper onion-architecture

我正在尝试配置我的Object Mapper而不知道我正在使用哪个mapper。 :/

这听起来有点奇怪。这样做的原因是我正在尝试使用洋葱架构,因此我的UI无法了解我的基础架构中的Object Mapper。有关示例,请参阅this solution

Onion Architecture

我在弄清楚如何“委托”无默认映射行为时遇到了一些麻烦。 像:

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<MyModel, MyViewModel>(Expression<Func<T>>),其中Func会做一些我现在无法弄清楚的黑魔法:( - 我是在正确的道路上还是我错过了一些必要的东西?

2 个答案:

答案 0 :(得分:11)

Onion Architecture不是关于配置与实现无关,而是关于执行

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

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

答案 1 :(得分:3)

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

为什么您的UI不了解您的映射器这么重要?假设您正在使用MVC,那么您将灵活地展示您选择的mappers功能,以平整我们的域模型,无论如何都要查看模型。

它是人们使用通用存储库实现的同样的废话,以防他们决定切换ORM中期项目。

仔细选择您的基础设施并坚持下去。