IMapper
初めて Autofac を使用して、オブジェクト マッピング要件を持つクラスにAutoMapper のインターフェイスを挿入しました。アセンブリ スキャンを使用して 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 の引数またはオプションの引数のみを持つコンストラクターが必要です
依存関係を満たすためにAutofac を使用するように AutoMapper に指示する必要があることは明らかです。ただし、そうするように指示する方法を見つけることができませんでした。
エラーをさらに明確にする必要がある場合は、完全なソリューションを GitHubで入手できます。