2010-07-30 11 views
1

Si certaines classes implémentent la même interface, elles contiennent toutes la même propriété. Est-il possible d'ajouter un formateur à ces propriétés? J'ai seulement trouvé la possibilité d'ajouter un formateur à un type de propriété spécifique.Automapper: Formatter pour la propriété d'interface

est ici un code qui devrait clarifier ce que je veux dire:

public interface ITaggable 
{ 
    IList<string> Tags { get; set; } 
} 

public class Post : ITaggable 
{ 
    public IList<string> Tags { get; set; } 
    public IList<string> Categories { get; set; } 
    ... 
} 

public class Page : ITaggable 
{ 
    public IList<string> Tags { get; set; } 
    .... 
} 

J'aimerais suivre ces voir des modèles qui ressemblent à ceci:

public class PostViewModel 
{ 
    public string Tags { get; set; } 
    public IList<string> Categories { get; set; } 
    ... 
} 

public class PageViewModel 
{ 
    public string Tags { get; set; } 
    ... 
} 

Si un Post a les balises "foo" et "bar", la propriété Tags doit contenir la chaîne "foo, bar". Categories devrait rester un IList<string>.

je pourrais y arriver en créant un formatter personnalisé, puis l'ajouter sur chaque carte, comme ceci:

protected override void Configure() 
{ 
    CreateMap<Post, PostViewModel>() 
     .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>()); 
    CreateMap<Page, PageViewModel>() 
     .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>()); 
} 

Mais je voudrais faire quelque chose comme ça (ce code ne fonctionne pas; -)

protected override void Configure() 
{ 
    ForSourceType<ITaggable>() 
     .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>()); 

    CreateMap<Post, PostViewModel>(); 
    CreateMap<Page, PageViewModel>(); 
} 
+0

essayer cette http://valueinjecter.codeplex.com/, c'est une approche totalement différente à la cartographie, vous pouvez imaginer une interface et cela fonctionnera encore (vous faites vos propres conventions) – Omu

+0

Merci pour votre suggestion. Je vais y jeter un coup d'oeil. – davehauser

Répondre

0

ce n'est pas exactement une réponse à la question que je posais, mais une solution au problème:

je construit un TagsFormatter qui vérifie le nom du bon ty pour "Tags":

public class TagsFormatter : IValueFormatter 
{ 
    public string FormatValue(ResolutionContext context) 
    { 
     if (context.MemberName.Equals("Tags", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      var tags = context.SourceValue as IList<string>; 
      if (tags != null) 
       return String.Join(", ", tags); 
     } 
     return context.SourceValue.ToString(); 
    } 
} 

Dans la configuration, je peux ensuite enregistrer ce Formatter pour toutes les applications:

public class ViewModelProfile : AutoMapper.Profile 
{ 
    protected override void Configure() 
    { 
     ForSourceType<IList<string>>().AddFormatter<TagsFormatter>(); 

     CreateMap<Post, PostViewModel>(); 
     CreateMap<Page, PageViewModel>(); 
    } 
}