自动映射器转换源只是暂时的

时间:2018-06-26 09:21:55

标签: c# database automapper

我写了一种从数据库对象转换为业务对象的一般可能性。

我的业务对象包含自定义属性,根据它们,我希望对其进行特定的操作。 从db读取数据非常容易,因为我可以使用aftermap(不是完美的解决方案,因为我必须通过反射来做到这一点,并根据它设置值)

但是在写回数据库时,我必须在beforeMap之前完成它,但这会改变源的永久性,但是我只是以一种短暂的方式喜欢它。动态执行Source的操作也是如此,但不要更改Source对象。

这是一个通用选项,因此我无法使用属性。

                protected static T MapFromDatabaseWithConversion<T, TSource>(TSource source) where T : MappingModel, new()
            {
                var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, T>().AfterMap((src, dest) => dest.ConvertFromDatabase()));
                return config.CreateMapper().Map<T>(source);
            }

对于动态检查属性的属性并根据其更改值,您有任何解决方案吗?或者您有任何想法仅动态更改源,因此不要将源操作的结果写入src obj?

非常感谢您。

1 个答案:

答案 0 :(得分:0)

我认为您必须在对象中包括价值跟踪。对于每个类成员,您将需要一个布尔值以反映值是否更改,以及一个立即检查所有值的方法,例如isObjectChanged()。您可以对此进行硬编码,也可以在运行时将其包装在Proxy对象中,这比较复杂,但是使用值跟踪数据/方法不会使您的类混乱。另一方面,Java数据对象(https://db.apache.org/jdo/)可以通过重新编译类文件为您完成此操作,以在类中包含有关更改值的值跟踪。设置它可能需要花费一些时间,对于您的特定问题可能有点过头了,但是当我针对同一项目中的多个数据源(例如数据库或电子表格)时,已经使用了很多次。 JDO允许我将相同的代码与可以在运行时交换的不同数据类型管理器一起使用。您还可以定位No-SQL数据库和其他数据存储。