在.NET开发中,对象映射是一个常见的需求,而AutoMapper是一个流行的库,用于简化对象之间的映射过程。然而,AutoMapper并不是万能的,有时在运行时可能会发现自己遗漏了一些属性映射。为了解决这个问题,可以使用AutoMapperPostBuilder这个工具,它能够在编译后立即提供反馈,告诉映射配置是否正确。
AutoMapper并不是一个完美的解决方案。可以找到许多关于为什么不应该使用AutoMapper的好文章或讨论。即使AutoMapper的作者Jimmy Bogard也描述了一些可能不适用AutoMapper的场景。尽管如此,在所遇到的依赖于AutoMapper的项目中,通常会实现AutoMapperPostBuilder。这个工具使用AutoMapper内置的Mapper.AssertConfigurationIsValid()
功能,在编译后直接调用。通过在项目中使用AutoMapper的后编译事件调用Invoke,它将帮助了解在映射中遗漏了哪些属性。
要开始使用AutoMapperPostBuilder,需要引用AutoMapperPostBuilder项目,并设置引用选项为'Copy Local = True'。这将确保AutoMapperPostBuilder.exe
被复制到项目输出文件夹中。在项目属性中,填写'Post-build event command line'字段:
$(TargetDir)AutoMapperPostBuilder.exe $(TargetPath)AutoMapperPostBuilder_Sample.MappingClass Invoke
在这个例子中,要调用的类是AutoMapperPostBuilder_Sample.MappingClass
。只需将该名称替换为想要调用的类名。
AutoMapperPostBuilder.exe
接受以下参数:
bin/debug/YourAssembly.dll
)Invoke
命令想要调用的类需要有以下方法:
public static void Invoke() {}
在(静态)构造函数中,可能已经写好了标准的映射,需要以以下方式结束:
Mapper.AssertConfigurationIsValid();
一个简单的映射类可能看起来像这样:
using AutoMapper;
namespace AutoMapperPostBuilder_Sample
{
static class MappingClass
{
static MappingClass()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<sampleclassb_1, sampleclassa_1>()
.ForMember(dest => dest.InnerProp1, opt => opt.MapFrom(src => src.InnerProp10))
.ForMember(dest => dest.InnerProp2, opt => opt.MapFrom(src => src.InnerProp20));
});
Mapper.AssertConfigurationIsValid();
}
public static void Invoke() {}
}
}
现在,如果编译项目并且构建成功(最初),后编译事件将触发AutoMapperPostBuilder.exe
,它将寻找指定的类并调用它。这将构建映射并调用AssertConfigurationIsValid
。如果映射有错误,它将在构建输出窗口中显示出来。
更好的是,后编译事件将注意到AutoMapperPostBuilder.exe
以代码1退出。这将导致构建失败。这正是想要的,因为不想等到启动应用程序并最终运行到那一行代码时才遇到异常。
AutoMapperPostBuilder
调用静态方法Invoke()
。这反过来会调用静态构造函数。因为映射是在构造函数中编写或调用的,能够利用Mapper.AssertConfigurationIsValid()
。AutoMapper本身会抛出有关无效映射的详细异常。这些异常被AutoMapperPostBuilder.exe
捕获并写入控制台。这些控制台输出将显示在Visual Studio构建输出中,或者使用的任何IDE中。