配置AutoMapper以使用AutoFac

时间:2018-03-05 19:04:14

标签: automapper autofac

我认为我已经将AutoMapper配置为使用AutoFac通过定义以下AutoFac模块来创建对象实例:

public class CommunityScannerManagerAutoMapProfile : Profile
{
    public CommunityScannerManagerAutoMapProfile()
    {
        CreateMap<CommunityUser, CommunityUserModel>()
            //.ConstructUsing(src => new CommunityUserModel(CSContainer.Instance.Resolve<IValidationService>()))
            .ForMember( dest => dest.VaultKey, opt => opt.MapFrom( src => src.VaultKeyName ) )
            .ReverseMap();

        CreateMap<Community, CommunityModel>()
            //.ConstructUsing(src=>new CommunityModel(CSContainer.Instance.Resolve<IValidationService>(  )))
            .ReverseMap();

        CreateMap<ScannerConfiguration, CommunitiesModel>()
            .ForMember( dest => dest.Communities, opt => opt.MapFrom( src => src.Communities ) )
            .ReverseMap();
    }
}

然后我创建了AutoMapper Profiles,如下所示:

CreateMap<CommunityUser, CommunityUserModel>()
    .ConstructUsing(src => CSContainer.Instance.Resolve<CommunityUserModel>())
    .ForMember( dest => dest.VaultKey, opt => opt.MapFrom( src => src.VaultKeyName ) )
    .ReverseMap();

目标类型构成层次结构:CommunitiesModel包含CommunityModel对象的集合,每个CommunityModel对象包含CommunityUserModel对象的集合。通过我创建的AutoMapper配置文件映射集合。

每个目标类型 - CommunitiesModel,CommunityModel和CommunityUserModel - 都具有在AutoFac中注册的构造函数参数(它们本身也在AutoFac中注册)。所以我认为AutoMapper能够解析它所需的实例,并调用AutoFac来创建它们。

但事实并非如此。除非我在AutoMapper Profile类中包含那两个注释掉的行 - 那些以ConstructUsing开头的行 - 我从AutoMapper获得一个异常,它只能处理带有没有参数的构造函数的类,或者只处理可选的类。这意味着AutoMapper没有使用AutoFac来解析/创建这些实例,这与我的预期相反。

有趣的是,AutoMapper创建CommunitiesModel(顶级对象)的实例没有问题,即使它也只有一个包含参数的构造函数。因此,AutoMapper将AutoFac用于顶级对象,而不是子对象。

我是否可以在AutoMapper中设置全局配置,告诉它始终使用AutoFac?我尝试在配置AutoMapper时使用ConstructServicesUsing(这里的代码注释掉了这行),但它似乎没有任何效果。

更新

显然,AutoMapper并没有使用DI来创建对象&#34;内部&#34; (见@ Lucian的评论)。

但是我注意到AutoMapper支持一个ConstructUsing()子句,它允许你将它绑定到像AutoMap这样的DI容器中:

{{1}}

所以一个相关/后续问题是:有没有办法使这个行为成为行为,而不必将行添加到适用的每个CreateMapper()调用?

0 个答案:

没有答案