在运行时动态构建配置

时间:2016-11-02 16:13:27

标签: c# automapper-5

我们有一个旧的(手摇)系统,它使用反射将一个模型映射到另一个模型。这使用模型上的属性来计算需要传输的内容。此转换在运行时在共享项目的基类内处理。

我正在考虑使用Automapper的实现在较低级别替换它 - 在测试期间,这在高音量时显然更快。

我想做的是继续使用遗留机制生成地图以保持一致性。我可以成功使用以下代码执行此操作:

public static IMapper CreateMap()
{
        var configuration = new MapperConfiguration(
                 BuildMapForModel<ModelA, ModelB>);

    var map = configuration.CreateMapper();

    return map;
}

public static void BuildMapForModel<TIn, TOut>(IMapperConfigurationExpression config)
{
    var expression = config.CreateMap<TIn, TOut>();

    //Build the mapping with reflection.
    foreach (var propertyInfo in typeof(TOut).GetProperties())
    {
        var attribute = propertyInfo.GetCustomAttribute(typeof(CustomMappingAttribute)) as CustomMappingAttribute;

        if (attribute == null)
        {
            expression.ForMember(propertyInfo.Name, opt => opt.Ignore());
        }
        else
        {
            var sourceproperty = attribute.SourcePropertyName;

            expression.ForMember(propertyInfo.Name, map => map.MapFrom(sourceproperty));
        }
    }

    expression.ReverseMap();
}

这很好用。然而,它依赖于每次为每个类构建映射。相反,我想使MapperConfiguration对象保持静态,以便可以重复使用它。此外,我希望能够根据需要添加到映射列表。

即。当我的代码请求ModelA和ModelB之间的映射时,我想确定我是否已经有了这个映射,如果没有,则运行代码来映射它。

private static MapperConfiguration Configuration { get; set; }

public static TOut Convert<TIn, TOut>(TIn item)
{
    if (Configuration == null)
    {
        //Create a new configuration object.
    }

    if (Configuration.FindTypeMapFor<TIn, TOut>() == null)
    {
        //Add a mapping to the configuration - via BuildMapForModel.
    }

    var map = Configuration.CreateMapper();
    return map.Map<TIn, TOut>(item);

}

但是,MapperConfiguration似乎不允许在创建后添加映射,也似乎不允许无参数构造函数。

如何设置它以便我只在必要时运行映射代码,但每次都要避免运行它?

0 个答案:

没有答案