AutoMapper convertir à partir de plusieurs sources
Disons que j'ai deux classes de modèles:
public class People {
public string FirstName {get;set;}
public string LastName {get;set;}
}
Ont aussi une classe de Téléphone:
public class Phone {
public string Number {get;set;}
}
Et je tiens à les convertir à un PeoplePhoneDto comme ceci:
public class PeoplePhoneDto {
public string FirstName {get;set;}
public string LastName {get;set;}
public string PhoneNumber {get;set;}
}
Disons que dans mon contrôleur, j'ai:
var people = repository.GetPeople(1);
var phone = repository.GetPhone(4);
//normally, without automapper I would made
return new PeoplePhoneDto(people, phone) ;
Je n'arrive pas à trouver un exemple de ce scénario. Est-ce possible ?
Remarque: l'Exemple n'est pas réel, juste pour cette question.
- alors que je suis d'accord il semble similaire, c'est une différence dans le problème qu'il cherche à résoudre. aussi il est difficile de comprendre à partir de cette question de savoir comment elle pourrait s'appliquer à celui-ci.
- Pourquoi ne pas faire
PeoplePhoneDto
ont unPeople
etPhone
membre? - Parce que ce n'est pas ce que je veux exposer.
- Vote pour rouvrir, - tandis que je pense que stackoverflow.com/questions/12429210/... est un doublon, il (avec sa seule réponse) semblent un peu trop localisé pour être considéré comme canonique. Il existe un précédent pour dupliquer questions ne comptant pas s'ils n'étaient pas répondu assez bien pour régler la question.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas directement de la carte de nombreuses sources pour une seule destination - vous devez demander les cartes une par une, comme décrit dans Andrew Whitaker réponse. Donc, vous devez définir tous les mappages:
Alors créer de l'objet de destination par l'une de ces correspondances, et d'appliquer les autres mappages pour objet créé. Et cette étape peut être simplifié avec extension très simple méthode:
L'utilisation est très simple:
Map
méthode d'extension est visible au point de vous faire de la cartographie (pour corriger l'aide de la directive est ajouté)Vous pouvez utiliser un
Tuple
pour cela:Dans le cas où vous auriez plus de la source de modèles, vous pouvez utiliser une autre représentation (Liste, Dictionnaire, ou autre chose) qui permettra de recueillir tous ces modèles comme une source.
Le code ci-dessus devrait preferaby être placés dans un AutoMapperConfiguration fichier, une seule fois et à l'échelle mondiale et a ensuite utilisé le cas échéant.
AutoMapper par défaut prend en charge une seule source de données. Donc, il n'y a pas de possibilité de régler directement de sources multiples (sans l'emballant dans une collection), car alors comment pourrions-nous savoir ce que dans le cas si, par exemple, deux modèles de la source ont des propriétés avec les mêmes noms?
Il y a cependant quelques solution pour y parvenir:
Et puis:
Mais pour être tout à fait honnête, même si je suis en utilisant AutoMapper depuis déjà quelques années, je n'ai jamais eu besoin d'utiliser la cartographie à partir de plusieurs sources.
Dans le cas lorsque, par exemple, j'avais besoin de plusieurs modèles d'affaires dans ma vue unique modèle, j'ai simplement intégré ces modèles dans le modèle de vue de classe.
Si dans votre cas, il devrait ressembler à ceci:
PeoplePhoneDto
vous l'avez suggéré, semble bon, mais je pense toujours que la cartographie à partir de sources multiples est utile, notamment en vue de cartographie des modèles. Je pense que la plupart des scénarios du monde réel besoin de sources multiples afin de construire un modèle de vue. Je suppose que vous pouvez créer des modèles de vue qui ne sont pas aplatis pour contourner le problème, mais je pense que c'est une bonne idée de créer les modèles de vue sans se soucier de ce que le schéma d'entreprise ressemble.Tuple<People, Phone>
le même queTuple<Phone, People>
?Item1
, la secondeItem2
, etc. En ce sens, l'ordre des questions.Si vous avez un scénario lorsque le type de destination doit être mappé à partir de l'une des sources et que vous souhaitez utiliser linq projections, vous pouvez effectuer les opérations suivantes.
J'avais besoin de ce, principalement pour la croix-appliquer des requêtes de ce genre.