10
votes

Automapper et immutabilité

est-il possible d'utiliser automapper avec des types immuables?

Par exemple, mon type de domaine est immuable et je souhaite mapper mon type de vue à cela.

Je crois que ce n'est pas mais je veux juste que cela confirme.

Également, car il est préférable d'avoir vos types de domaine immuables, quelle est la meilleure pratique lorsque vous mappiez vos types d'affichage aux types de domaine?


1 commentaires

Types de domaine immuables? Je ne crois pas que ce serait une déclaration correcte


5 Réponses :


9
votes

Je fais généralement le mappage des types de visualisation aux types de domaine à la main, car je fonctionnerai généralement par une interface plus complexe, en utilisant des méthodes et ainsi de suite. Si vous utilisez automapper pour passer de la vue sur le domaine, vous êtes maintenant enfermé vers un modèle de domaine anémique, que vous ayez décidé ou non de votre choix.


3 commentaires

Pourquoi diriez-vous que le modèle de domaine est anémique, si vous utilisez automapper pour mapper de la vue sur le domaine? Vous aurez besoin de votre modèle de domaine peuplé avec les données de la vue en quelque sorte. Est-ce parce que vous proposez de créer / peupler le domaine via des ctors / méthodes à la place?


Oui, exactement. Consultez ma série sur le renforcement de votre domaine: Lostechies.com/Blogs/jimmy_bogard/archive/2010/02/03/... Si vous regardez d'autres frameworks MVC, comme des rails, le concept d'un modèle est un modèle persistant, alors vous Don 't besoin de Fadificer.


Je pense que vos articles me sont influencés, j'ai souvent utilisé Comtableapper pour mapper des objets de domaine vers DTO / VM, mais nous finissons toujours à avoir à rechercher la manière de faire de la manière de faire de la façonneuse. Le faire à la main ne facilite pas la lecture et la déboguer. Comment structurez-vous le code - I.e. Où mettez-vous les méthodes qui mappent les propriétés des objets?



1
votes

FOWNAPPER s'appuie sur des sécheurs de propriété pour effectuer son travail, de sorte que si vous avez des propriétés en lecture seule, MODApper ne sera pas très utile.

Vous pouvez remplacer le comportement de mappage et, par exemple, le configurer pour appeler un constructeur spécifique, mais qui vaincre essentiellement le but de MODAPPPER, car vous faites ensuite la cartographie manuellement et que vous n'avez réussi que d'ajouter un supplément maladroit. pas dans le processus.

Cela n'a pas beaucoup de sens pour moi que votre modèle de domaine est immuable. Comment mettez-vous la mise à jour? L'application entière est-elle en lecture seule? Et si oui, pourquoi auriez-vous jamais besoin de mapper vers votre modèle de domaine par opposition à de ? Un modèle de domaine immuable sonne ... assez inutile.

P.s. Je suppose que vous voulez dire Cet automapper et non le Cartographie automatique de Nibernate fluide ou même une autre chose totalement différente. Si tel est faux, vous devriez être plus spécifique et ajouter des balises pour votre plate-forme / langue.


2 commentaires

"Cela n'a pas de sens pour moi que votre modèle de domaine est immuable.": ça fait. Imaginez que vous utilisez des CQRS par exemple. Le modèle de lecture doit être immuable. Un autre exemple est une valeurObject.


Je suis en désaccord avec ce commentaire et en excusant, mais les DTO immuables sont valides et l'utilisation d'une mappeuse standard est aussi valide. Vous voulez que votre logique de mappage soit universelle, de sorte que la cartographie des octets [], des types immuables, des cordes ou de quoi avez-vous, alors je vous recommande de le rendre standard. L'utilisation de MOWERAPPPER peut être sur la base de la cartographie de tous types, mais à l'aide de la même interface de mappage n'est pas. Je crois que Crowerapper devrait rechercher et essayer d'utiliser la cartographie du constructeur si les champs sont privés, cependant, vous pouvez même créer un champ réadien avec une réflexion afin que mon intestin me dit que c'est possible.



2
votes

Supposons que vous souhaitiez vraiment avoir une propriété immuable sur votre type de domaine, disons ID code>. Votre type de domaine peut ressembler à quelque chose comme ceci: xxx pré>

alors vous pouvez utiliser constructif code> à l'aide d'un constructeur public de votre choix, tel que: p>

CreateMap<ViewType, DomainType>()
    .ConstructUsing(vt => new DomainType(vt.Id));


2 commentaires

Si VIEWTYPE contient également une propriété nommée «ID», vous n'avez pas besoin de vous déranger avec .construction (). MODAPAPPER utilisera le constructeur et correspond à des noms de paramètres avec les noms de propriétés source automatiquement.


Voici une réponse que je peux faire à bord. Merci.



0
votes

Nous avons des objets immuables à l'aide du modèle de constructeur. Les cartographier leur indicitent un peu plus de code de la chaudière, mais il est possible xxx pré>

NOS Profils code> Dont trois mappages enregistrés: P>

var result = _mapper<IVehicleViewModel>(_carModel);


2 commentaires

@Lucianbargaoanu que l'article couvre la construction d'un objet en utilisant des paramètres sur un constructeur public que je ne pensais pas fonctionnerait pour moi


Cela n'a pas besoin d'être public.



0
votes

Vous pouvez utiliser FOWORAPPER avec des classes ou des enregistrements possédant uniquement des configurateurs de propriétés. Ceci est nouveau en C # 9.0.

Comtableapper peut définir les propriétés de la création d'objets car les propriétés ont uniquement des Setteurs d'init, mais après que MODApper ait mappée, ils sont verrouillés (immuables).

HTTPS: / /wwww.tsunamisolutions.com/blog/c-90-Records-and-Dtos-a-Match-Made-in-redmond


2 commentaires

Vous avez posté ce lien sur trois messages différents maintenant, avec à peine toutes les informations supplémentaires. Bien que les réponses puissent faire référence à des ressources externes, elles devraient également être autonomes, de sorte que les lecteurs ne sont pas dépendants sur eux. De plus, si cela se trouve être votre blog , vous devriez être sûr de revoir Règles d'auto-promotion de la pile .


Comme il est actuellement écrit, votre réponse n'est pas claire. S'il vous plaît Modifier Pour ajouter des détails supplémentaires qui aideront les autres à comprendre comment cela répond à la question posée. Vous pouvez trouver plus d'informations sur la façon d'écrire de bonnes réponses dans le centre d'aide .