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

Snæ*_*ørn 1 dependency-injection automapper onion-architecture

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

这可能听起来有点奇怪.这样做的原因是我正在尝试使用洋葱架构,因此我的UI无法了解我的基础架构中的Object Mapper.请参阅此解决方案以获取示例.

洋葱建筑

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

Mapper
    .CreateMap<MyModel, MyDestViewModel>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );
Run Code Online (Sandbox Code Playgroud)

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我以为我可以做以下事情.(IMapper是位于Domain中的自定义接口)

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

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

我正在思考这些方面的事情,mapper.CreateMap<MyModel, MyViewModel>(Expression<Func<T>>)其中Func会做一些我现在无法弄清楚的黑魔法:( - 我是在正确的道路上还是我错过了一些必要的东西?

Jim*_*ard 11

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

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

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