C# 如何让AutoMapper处理自定义命名约定?

C# 如何让AutoMapper处理自定义命名约定?,c#,automapper,C#,Automapper,在我正在从事的项目中,我们正在将自动生成的DTO映射到业务对象。数据库有一个不同寻常(但基本一致)的命名约定,这意味着可以将大多数DTO属性名称转换为其等效的业务对象属性名称,从而节省许多代码行 例如,在DTO(和数据库)中,我们有一个名为account\u ID\u created的属性,它将映射到名为CreatedAccountId的BO属性。这是在MemberNameTransformer.GetBoMemberName()中发生的一种转换,因此它不像使用不同分隔符的稍微不同的约定那么简单

在我正在从事的项目中,我们正在将自动生成的DTO映射到业务对象。数据库有一个不同寻常(但基本一致)的命名约定,这意味着可以将大多数DTO属性名称转换为其等效的业务对象属性名称,从而节省许多代码行

例如,在DTO(和数据库)中,我们有一个名为
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”已被删除