C# 如何让AutoMapper处理自定义命名约定?
在我正在从事的项目中,我们正在将自动生成的DTO映射到业务对象。数据库有一个不同寻常(但基本一致)的命名约定,这意味着可以将大多数DTO属性名称转换为其等效的业务对象属性名称,从而节省许多代码行 例如,在DTO(和数据库)中,我们有一个名为C# 如何让AutoMapper处理自定义命名约定?,c#,automapper,C#,Automapper,在我正在从事的项目中,我们正在将自动生成的DTO映射到业务对象。数据库有一个不同寻常(但基本一致)的命名约定,这意味着可以将大多数DTO属性名称转换为其等效的业务对象属性名称,从而节省许多代码行 例如,在DTO(和数据库)中,我们有一个名为account\u ID\u created的属性,它将映射到名为CreatedAccountId的BO属性。这是在MemberNameTransformer.GetBoMemberName()中发生的一种转换,因此它不像使用不同分隔符的稍微不同的约定那么简单
account\u ID\u created
的属性,它将映射到名为CreatedAccountId
的BO属性。这是在MemberNameTransformer.GetBoMemberName()
中发生的一种转换,因此它不像使用不同分隔符的稍微不同的约定那么简单
根据AutoMapper源代码中提供的信息,我最好的猜测是:
public class DtoBoMappingOptions : IMappingOptions
{
public INamingConvention SourceMemberNamingConvention
{
get { return new PascalCaseNamingConvention(); }
set { throw new NotImplementedException(); }
}
public INamingConvention DestinationMemberNamingConvention
{
get { return new PascalCaseNamingConvention(); }
set { throw new NotImplementedException(); }
}
public Func<string, string> SourceMemberNameTransformer
{
get { return s => s; }
set { throw new NotImplementedException(); }
}
public Func<string, string> DestinationMemberNameTransformer
{
get { return MemberNameTransformer.GetBoMemberName; }
set { throw new NotImplementedException(); }
}
}
公共类DtoBoMappingOptions:IMappingOptions
{
公共INamingConvention SourceMemberNamingConvention
{
获取{return new PascalCaseNamingConvention();}
设置{抛出新的NotImplementedException();}
}
公众参与会议目的地成员参与会议
{
获取{return new PascalCaseNamingConvention();}
设置{抛出新的NotImplementedException();}
}
公共函数SourceMemberNameTransformer
{
获取{returns=>s;}
设置{抛出新的NotImplementedException();}
}
公共函数DestinationMemberNameTransformer
{
获取{return MemberNameTransformer.GetBoMemberName;}
设置{抛出新的NotImplementedException();}
}
}
现在,在将SomeDto映射到SomeBusinessClass时,我如何告诉映射器使用这些选项?我意识到我可能在IMappingOptions中使用了错误的接口。我试图完成的真正内容是MemeberNameTransformer.GetBoMemberName()
额外积分:在将任何IDto映射到IBusinessObject时,我如何告诉映射器使用这些选项?如果情况确实一致,例如textFirstName,则可以使用一些内置函数
Mapper.Initialize(cfg => cfg.RecognizePrefixes(new[] { "text" }));
否则,您需要在MingConvention中编写自己的
class DTONaming : INamingConvention
{
#region INamingConvention Members
public string SeparatorCharacter
{
get { return string.Empty; }
}
public Regex SplittingExpression
{
get { return new Regex(""); }
}
#endregion
}
然后你可以在automapper注册
Mapper.Initialize(cfg => cfg.SourceMemberNamingConvention = new DTONaming());
AutoMapper会将其用于任何映射,因此如果需要限制这些前缀或自定义命名对象的注册,则可能需要对其进行初始化和重新初始化。不过,我怀疑命名方案是否会产生后果
编辑
对于最近添加的内容,您将使用SourceMemberNameTransformer
。这允许您自己编写一个转换名称的函数
Mapper.Initialize(cfg => cfg.SourceMemberNameTransformer = ConvertNames);
private static string ConvertNames(string inputString)
{
var sections = inputString.Split('_');
// transform the sections into w/e you need
return inputString;
}
我认为这对我所需要的不起作用。我已经更新了这个问题,以反映我正在使用的命名约定到底是什么。我真的需要我的Func告诉我哪个目标成员来自哪个源成员。@Josh Kodroff检查更新的答案,我想这就是你需要的。就这样!我只是不知道在哪里设置SourceMemberNameTransformer。现在,我在多个层(DTO、BO、VM)中使用映射器,所以我不想普遍使用该转换器。关于如何确保不会发生这种情况有什么想法吗?在Automapper的2.1.1版之后,属性“SourceMemberNameTransformer”已被删除