在我正在开发的项目中,我们将自动生成的DTO映射到业务对象.该数据库有一个啊哈不寻常的(但基本一致)的命名约定,这意味着它可能最DTO属性名称转换为等效的业务对象属性的名称,这样就节省了很多行代码.
例如,在DTO(和数据库)中,我们有一个名为的属性account_ID__created,它将映射到一个名为的BO属性CreatedAccountId.这是发生的一种转变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(); }
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在将SomeDto映射到SomeBusinessClass时,如何告诉Mapper使用这些选项?我意识到我可能在IMappingOptions中有错误的界面.我正在努力实现的真正的核心是MemeberNameTransformer.GetBoMemberName().
额外功劳:在将任何 ID 映射到IBusinessObject 时,如何告诉Mapper使用这些选项?
如果事情真的一致,比如textFirstName,你可以使用一些内置函数.
Mapper.Initialize(cfg => cfg.RecognizePrefixes(new[] { "text" }));
Run Code Online (Sandbox Code Playgroud)
否则,您需要编写自己的INamingConvention类,看起来像这样.
class DTONaming : INamingConvention
{
#region INamingConvention Members
public string SeparatorCharacter
{
get { return string.Empty; }
}
public Regex SplittingExpression
{
get { return new Regex(""); }
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用automapper注册它.
Mapper.Initialize(cfg => cfg.SourceMemberNamingConvention = new DTONaming());
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3284 次 |
| 最近记录: |