我处理Mappster- 有这样的课程:
class In
{
public string A;
public string B;
public string C;
}
class Out
{
public Sub Sub;
public string C;
}
class Sub
{
public string A;
public string B;
public Sub(string a, string b)
=>(A,B) = (a,b);
}
我制定了规则:
var mapper = new Mapper();
mapper.Config
.ForType<In, Out>()
.Map(@out=> @out.Sub, @in => new Sub(@in.A, @in.B));
如果您现在映射一切都很好,但是如果您Sub向该类添加另一个构造函数(假设public Sub(string a)=> A=a;)映射将因错误而失败
Error while compiling
source=UserQuery+In
destination=UserQuery+Out
type=Map
Error while compiling
source=UserQuery+Sub
destination=UserQuery+Sub
type=Map
No default constructor for type 'Sub', please use 'ConstructUsing' or 'MapWith'
我阅读了文档,以这种方式进行了尝试,但 'ConstructUsing' 和 'MapWith' - 不起作用(或者,更有可能是我做错了什么)。
找到了,在配置里加
然后,即使是我的具体情况也可以:
我们检查:
我一直相信并继续相信任何实用程序/库都应该简化编写代码。可以使用自动映射器,但前提是它们自动完成工作。一旦您必须在映射器配置中手动描述映射,最好拒绝它。
在我展示的示例中,手动映射是基本的。虽然带有映射器规则描述的配置要大几倍。那为什么要多写?
我不使用 AutoMapper 背后的原因- 一篇精彩的文章(以及一般的好博客),我建议阅读它。在评论中有一个指向这个 AutoMapper 的作者的答案的链接,他在那里玩耍,但最后他承认,大多数时候使用他的创意是没有意义的。