具有构造函数参数的AutoMapping对象

我正在尝试将AutoMapper配置为需要构造函数参数的类。 我已经完成了很多关于这方面的在线研究,并发现了几个例子......但他们要么不使用基于实例的AutoMapper,要么他们使用旧版本的AutoMapper。

我使用AutoMapper深入克隆对象。 这是我创建的配置文件:

public class ScannerAutoMapProfile : Profile
{
    public ScannerAutoMapProfile()
    {
        CreateMap<AzureConfiguration>();
        CreateMap<CommunityUser>();
        CreateMap<Community>();
        CreateMap<Contact>();
        CreateMap<DatabaseConnection>();
        CreateMap<DatabaseConfiguration>();
        CreateMap<LoginManagement>();
        CreateMap<MaxLoadSeconds>();
        CreateMap<ScanTime>();
        CreateMap<ScanningAcceleration>();
        CreateMap<ScanningWindow>();
        CreateMap<ScanningInterval>();
        CreateMap<Scanning>();
        CreateMap<SearchParameterUser>();
        CreateMap<SearchParameter>();
        CreateMap<ScannerConfiguration>();
    }

    private void CreateMap<TModel>()
    {
        CreateMap<TModel, TModel>();
    }
}

使用ScannerConfiguration时会出现问题,它只接受一个字符串参数。

这里是我正在使用的Autofac模块:

public class AutoMapperModule : Module
{
    protected override void Load( ContainerBuilder builder )
    {
        base.Load( builder );

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();

        builder.RegisterAssemblyTypes( assemblies )
            .Where( t => typeof(Profile).IsAssignableFrom( t ) && !t.IsAbstract && t.IsPublic )
            .As<Profile>();

        builder.Register( c => new MapperConfiguration( cfg =>
            {
                foreach( var profile in c.Resolve<IEnumerable<Profile>>() )
                {
                    cfg.AddProfile( profile );
                }
            } ) )
            .AsSelf()
            .SingleInstance();

        builder.Register( c => c.Resolve<MapperConfiguration>().CreateMapper( c.Resolve ) )
            .As<IMapper>()
            .SingleInstance();
    }
}

(比如http://www.protomatter.co.uk/blog/development/2017/02/modular-automapper-registrations-with-autofac/)。

我可以成功实例化一个IMapper,它显示Autofac的东西工作正常。 但是当我尝试拨打地图时:

_onDisk = Mapper.Map<ScannerConfiguration>( _inMemory );

它会因“ScannerConfiguration没有无参数构造函数”异常而失败。

不幸的是,虽然我很确定我需要为Map()调用提供一些选项,但我一直无法弄清楚如何去做。 我需要传入构造函数的参数是ScannerConfiguration的一个公共属性,名为SourceFilePath。


由于ScannerConfiguration需要一个参数,为什么不自己初始化它?

var sc = new ScannerConfiguration("some string value");
_onDisk = Mapper.Map( _inMemory, sc );

如果Automapper无法使用默认构造函数创建目标实例,则可以为Automapper提供一个调用构造函数并使用ConstructUsing返回新实例的ConstructUsing 。 在它构造对象之后,它像往常一样继续映射。

例如,这里有一个源和目标类。 不调用非默认构造函数就不能创建目标类:

public class SourceClass
{
    public string SourceStringProperty { get; set; }
    public int OtherSourceProperty { get; set; }
    public bool SameNameInBoth { get; set; }
}

public class DestinationClass
{
    public DestinationClass(string destinationString)
    {
        DestinationStringPropertyFromConstructor = destinationString;
    }

    public string DestinationStringPropertyFromConstructor { get; }
    public int OtherDestinationProperty { get; set; }
    public bool SameNameInBoth { get; set; }
}

映射将如下所示:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<SourceClass, DestinationClass>()

        .ConstructUsing(hasString => new DestinationClass(hasString.SourceStringProperty))

        .ForMember(dest => dest.OtherDestinationProperty,
            opt => opt.MapFrom(src => src.OtherSourceProperty));
});

为了说明除了指定构造函数之外,我添加了其他属性,其他配置细节都是相同的。

链接地址: http://www.djcxy.com/p/37405.html

上一篇: AutoMapping Object with Constructor Arguments

下一篇: AutoMapper: Int to String and back again