2010-10-05 17 views
5

Dans le projet sur lequel je travaille, nous mappons les DTO générés automatiquement aux objets métier. La base de données a une convention de dénomination inhabituelle (mais largement cohérente), ce qui signifie qu'il est possible de transformer la plupart des noms de propriété DTO en noms de propriété d'objet métier équivalents, sauvant ainsi de nombreuses lignes de code. Par exemple, dans le DTO (et la base de données), nous avons une propriété appelée account_ID__created qui sera mappée à une propriété BO appelée CreatedAccountId. C'est le genre de transformation qui se passe dans MemberNameTransformer.GetBoMemberName(), donc ce n'est pas aussi simple qu'une convention légèrement différente avec un séparateur différent.Comment puis-je configurer AutoMapper pour gérer une convention de dénomination personnalisée?

Après ce que j'ai disponible dans le code source AutoMapper, j'ai ce que ma meilleure estimation:

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(); } 
    } 
} 

Maintenant, comment puis-je dire le mappeur d'utiliser ces options lors du mappage SomeDto à SomeBusinessClass? Je me rends compte que je peux avoir la mauvaise interface dans IMappingOptions. La vraie viande de ce que j'essaie d'accomplir est en MemeberNameTransformer.GetBoMemberName().

Crédit supplémentaire: Comment puis-je dire le mappeur d'utiliser ces options lors du mappage une à IBusinessObject ID photopour?

Répondre

6

Si les choses sont vraiment cohérentes, comme textFirstName, vous pouvez utiliser certaines fonctions intégrées.

Mapper.Initialize(cfg => cfg.RecognizePrefixes(new[] { "text" })); 

Sinon, vous devrez écrire votre propre classe INamingConvention qui ressemble à quelque chose comme ça ..

class DTONaming : INamingConvention 
{ 

    #region INamingConvention Members 

    public string SeparatorCharacter 
    { 
     get { return string.Empty; } 
    } 

    public Regex SplittingExpression 
    { 
     get { return new Regex(""); } 
    } 

    #endregion 
} 

Ensuite, vous pouvez enregistrer ce avec automapper.

Mapper.Initialize(cfg => cfg.SourceMemberNamingConvention = new DTONaming()); 

Et AutoMapper utilisera ce pour toutes les applications, donc si vous devez restreindre l'enregistrement de ces préfixes ou de nommer les objets personnalisés dont vous avez besoin pour initialiser et ré-initialiser ou quelque chose. Je doute que le schéma de nommage aurait des conséquences cependant.

Modifier

Avec vos ajouts récents que vous allez utiliser un SourceMemberNameTransformer à la place. Cela vous permet d'écrire une fonction qui convertit les noms vous-même.

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; 
} 
+0

Je ne pense pas que cela fonctionnera pour ce dont j'ai besoin. J'ai mis à jour la question pour refléter exactement la convention de nommage avec laquelle je travaille. J'ai vraiment besoin de mon Func pour dire quel membre de destination vient de quel membre source. –

+0

@Josh Kodroff vérifier la réponse mise à jour, je pense que ce sera ce dont vous avez besoin. – Jab

+0

C'est tout! Je ne pouvais juste pas savoir où placer le SourceMemberNameTransformer. Maintenant, j'utilise le Mapper dans plusieurs couches (DTO, BO, VM), donc je ne veux pas utiliser ce transformateur universellement. Des idées sur la façon de s'assurer que cela n'arrive pas? –