我认为我已经将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()调用?