我第一次使用 Autofac 将 AutoMapper 的IMapper
接口注入到具有对象映射要求的类中。在一些帮助下,我取得了一些进展,使用 Assembly Scanning 将各种依赖项添加到 AutoMapper 的寄存器中:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.AsClosedTypesOf(typeof(ITypeConverter<,>))
.AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof(AutoMapperExtensions).Assembly)
.AssignableTo<Profile>().As<Profile>();
builder.Register(context => {
var profiles = context.Resolve<IEnumerable<Profile>>();
return new MapperConfiguration(x => {
foreach (var profile in profiles) x.AddProfile(profile);
});
}).SingleInstance().AutoActivate().AsSelf();
builder.Register(context => {
var componentContext = context.Resolve<IComponentContext>();
var config = componentContext.Resolve<MapperConfiguration>();
return config.CreateMapper();
}).As<IMapper>();
这对于ITypeConverter<,>
没有任何注入依赖项的情况非常有效:
public class SourceToDestinationTypeConverter : ITypeConverter<SourceModel, DestinationModel> {
public DestinationModel Convert(SourceModel source, DestinationModel destination, ResolutionContext context) {
if (source.Items == null) {
return null;
}
return new DestinationModel {
FirstItem = source.Items.FirstOrDefault(),
LastItem = source.Items.LastOrDefault()
};
}
}
但是,从我添加依赖项的那一刻起,在这个人为的示例中,验证器:
public class SourceToDestinationTypeConverter : ITypeConverter<SourceModel, DestinationModel> {
private readonly IValidator<SourceModel> _validator;
public SourceToDestinationTypeConverter(IValidator<SourceModel> validator) {
_validator = validator;
}
public DestinationModel Convert(SourceModel source, DestinationModel destination, ResolutionContext context) {
if (!_validator.Validate(source)) return null;
return new DestinationModel {
FirstItem = source.Items.FirstOrDefault(),
LastItem = source.Items.LastOrDefault()
};
}
}
抛出以下异常:
Application.TypeConverters.SourceToDestinationTypeConverter
需要有一个带有 0 个参数或只有可选参数的构造函数
对我来说很清楚需要告诉 AutoMapper 使用 Autofac来满足依赖关系。但是,我无法找到如何告诉它这样做。
如果需要进一步澄清错误,可以在 GitHub 上找到完整的解决方案。