12
votes

Utilisation de la version d'instance de CreatEMAP et de la carte avec un service WCF?

Avoir des problèmes réels avec Comtableapper. Je pense avoir trouvé la solution mais je ne sais pas comment la mettre en œuvre.

En gros, j'utilise un mappage personnalisé avec Résolvant et construit de manière à transmettre des paramètres params au constructeur, je comprends que la plupart des gens l'ont configuré dans le global.aSax une fois et oubliez-le. p>

Mais le problème est que ma méthode (sur une WCF) passe dans différents params au constructeur d'une résolution ...... p>

avant i utilisait le mapper.createmap et mapper.map, qui sont des méthodes statiques et qu'il apparaît que lorsque différentes pétitions entrent dans le service de WCF via des méthodes (multi-insérences), elles sont contradictoires. P>

Après avoir lu quelque chose Il semble que je puisse utiliser la version d'instance de Creatempap ​​et ma carte afin que chaque pétition individuelle ait sa propre carte et peut transmettre ses propres paramètres. P>

Mais je ne peux pas sembler trouver comment le faire. Quelqu'un peut-il expliquer s'il vous plaît? Je suis vraiment coincé ... p>

Avant de nouveau et encore je voudrais obtenir des erreurs de clé en double et que je mettrai également une trace de journal sur le constructeur et que 1 pétition écrase l'autre - par conséquent les versions statiques de mapper. p>

Eh bien, j'espère que je suis correct, mais je ne trouve rien d'autre ... p>

édité - un exemple de ce que j'ai strong> P>

Fondamentalement, tout mappage fonctionne comme il se doit, car j'utilise MapFrom dans la plupart des cas. P>

Puis je crée une instance de mon résolveur que je passe dans une URL. J'ai vérifié l'URL avant que je le passe et que c'est correct. Mais une fois qu'il renvoie, il renvoie la mauvaise URL. P>

La raison pour laquelle j'ai besoin de passer dans l'URL est qu'elle a des variables là-bas afin de remplacer les variables ... fondamentalement, il y a 2 URL en fonction de la Office et moi avons des journaux partout et je peux voir ce que je passe, mais une fois que je le crois, ce n'est pas celui que je suis passé, si cela a du sens, c'est bizarre !! P>

Son service WCF et un client a appelé la méthode deux fois en passant dans 2 bureaux différents, donc 2 URL différentes. Mais ils retournent toujours la même URL. C'est comme une session écrasante l'autre ... p>

J'espère que cela a du sens. P> xxx pré>

découvrit où échoue - mais inconnu Pourquoi strong> p>

Voir mes commentaires en ligne avec le code. Dans le constructeur, l'URLTemplate arrive, je l'enregistre dans un Var privé puis dans la résolution remplie, c'est autre chose: -) p>

J'ai placé des journaux log4net là-bas, afin que je puisse voir ce qui se passe.

[Log]
public class SalesPointResolver : ValueResolver<Models.Custom.House, IList<DTO.SalesPoint>>
{
    private readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    private string urlTemplate;

    public SalesPointResolver (bool returnReservationUrl, string urlTemplate, DateTime startDate, DateTime endDate, string officeCode)
    {
        this.urlTemplate = urlTemplate;

        log.Error("passed in " + urlTemplate); // THIS IS PERFECT
        log.Error("I am now " + this.urlTemplate); // THIS IS PERFECT
    }

    protected override IList<DTO.SalesPoint> ResolveCore(House source)
    {
        this.house = source;

        log.Error("in  resolveCore :" + this.urlTemplate); // THIS IS RETURNING THE WRONG VALUE


9 commentaires

Dans votre exemple, c'est que vous ne connaissez pas la source avant l'exécution, mais vous savez quelle cible vous êtes la cartographie à la compilation?


Non, je connais la source ... mais je passe dans des variables à résoudre en utilisant le constructeur d'où la carte doit être créée à chaque fois et doit ne pas être partagée par aucune autre session, etc.


S'il s'agit d'un service WCF, il est en cours d'exécution dans son propre domaine d'application afin que les cartes ne soient partagées avec aucun autre processus. On dirait que les arguments à résoudre varient, mais le résolvement prend le type source typiquement. Quel est le raisonnement pour vous de transmettre des arguments dans le constructeur de votre résolveur de valeur personnalisé qui sont en dehors de votre type source?


Bonjour merci de me revenir à moi, bien par exemple, je suis en train de passer des jours de location (nombre de jours de location) comme il n'est pas à la source, car je dois l'utiliser dans mon résolution.


L'autre type que je fais est en train de transmettre une liste à un résolveur pour renvoyer une liste à la SRC? Pourquoi? Étant donné que la liste est une collection de chaînes, mais les chaînes contiennent des variables .. donc mon résolution remplace les variables avec des valeurs réelles et reconstruit la liste pour le renvoyer à la source ..


Puis-je fournisseur d'informations supplémentaires - s'il vous plaît laissez-moi savoir?


En ce qui concerne les jours de location, cela va sonner bizarre !! Je sais ... mais j'ai la configuration des journaux (log4net). J'utilise une variable locale qui, par exemple), IS = 2 et je le transmettent dans la résolution dans la réducteur de la méthode que j'utilise sur résolution, j'ai placé un autre journal pour imprimer la valeur de ce qui est passé et il est = 1 !!! Yeh je sais étrange .. Les autres sessions ont défini ceci à 1 .. donc je suppose que c'est écrasement ou quelque chose. C'est mon synataxe .. Opt.Resolvedux à (). Constructured (() => Nouveau CalculatRiceresolver (réalrentaldays )


Basé sur ce que je vois ici, vous avez un service de servicePriseService utilisé pour calculer un prix basé sur le réalrentaldays. Je pense que vous ne voudrez peut-être pas utiliser SOWORAPPER pour cela, mais peut-être avoir une étape dans votre service WCF qui calcule la valeur en dehors de la cartographie. En règle générale, j'utilise la mappage pour mapper des valeurs d'un type dans une autre ou des hiérarchies d'objets aplatit. Cela peut ne pas appartenir au processus de cartographie.


Ok Michael, merci! Bon point - Ok je vais essayer de le déplacer ... et mettez-le dans une méthode standard de quelque sorte. Le problème étant que la "méthode" des prix s'appuie sur la propriété des prix qui se trouve dans mon objet de cartographie "SRC".


5 Réponses :


1
votes

Avez-vous regardé à l'aide de l'appel de la carte qui prend l'objet de destination?

var bar = nouvelle barre ("personnalisé chaque appel");

mapper.map (foo, bar);


7 commentaires

Merci Jimmy, je ne sais pas si je comprends bien. Si je change de carte, je n'aurai pas accès à mon objet SRC standard que j'ai besoin, car je fais des mappages normalement que sur quelques propriétés qui vous obligent à appeler la résolution spéciale et en passant un paramètre car il y a un peu mal de logique ici ... donc en résolus, j'utilise toujours mon objet SRC standard, mais appliquez une logique supplémentaire avant de retourner (dans ce cas une Stringg) - Suis-je mal compris?


Si vous pouviez élaborer, je l'apprécierais beaucoup.


Je pense que j'ai mal compris - avez-vous un petit extrait qui montre comment vous utilisez le CreatEMAP et les appels cartographiques?


Salut Jimmy, merci de me revenir à moi .. Yep Bien sûr. Je vais mettre à jour ma question maintenant ..


Une question ok a été mise à jour avec un exemple de ce que je fais, en utilisant "Résoudre" ... Avant d'utiliser ConstructedBy, mais je crée maintenant l'instance et la transmettant dans la résolution - j'espère que cela a du sens ..


Bonjour Jimmy, j'ai fait des tests approfondis et j'ai mis à jour ma question. S'il vous plaît pardonner que ça soit un peu long, mais je voulais tout inclure. Le résumé est celui-ci .. La valeur correcte arrive dans la constructeur et économisez en privé, puis lorsqu'il exécute la substitution Resolvecore, il renvoie le mauvais :-) ..


Bonjour Jimmy, j'ai encore mis à jour mon msg - j'espère avoir tout expliqué correct, il y a une petite solution temporaire que j'ai faite - alternée non idéale - je l'ai expliquée dans mon message original que je viens de modifier. Attendons avec impatience les pensées que vous avez sur mon problème. Merci une fois de plus



2
votes

Eh bien, il semble que ma question soit abandonnée, mais après un certain temps, j'ai enfin trouvé une bonne solution.

Fondamentalement, j'étais à l'intérieur d'une résolution et j'avais une autre carte que l'une des propriétés appelée une autre résolution ...

Il semble qu'il semble y avoir un problème avec cela. Une autre chose étrange est qu'elle a échoué chaque fois que le pool d'applications ait été démarré ou recyclé .. D'où cela a échoué la première fois, puis naviguait jusqu'à ce que le recyclage soit arrivé (j'utilise une application WCF).

J'ai donc remplacé le deuxième mappage avec une pourbeach et ma cartographie comme celle-ci à l'intérieur de ma résolution d'origine ...

J'ai mis la réponse ici au cas où cela pourrait aider quelqu'un d'autre à l'avenir.

J'utilisais les méthodes statiques du mapper pour faire mes mappages, celles-ci n'étaient pas dans Global.Asax, car je dois transmettre différentes choses en fonction de certains facteurs.

Je me suis toujours demandé s'il serait possible de le faire avec des versions d'instance de Mapper, je même qu'il existait ..... mais jamais découvert ..

Mais de toute façon, tout fonctionne 100% maintenant ...


1 commentaires

1
votes

Si vous souhaitez utiliser une version instanciée du mappeur de SURACHAPPER, je pense que vous pouvez utiliser la classe MappingEngine. Je crois que les instanciats de la classe de mappeuse statique et configurent un objet MappingEngine pour faire tout le travail de cartographie granuleux Nitty.

Voici un exemple d'application de CIO à SOaSTApper (qui nécessite une instanciation du mappage)

http: // www. Lostechies.com/blogs/jimmy_bogard/archive/2009/05/11/automapper-and-ioc.aspx


0 commentaires

34
votes

Oui, il existe un moyen d'utiliser une version d'instance de Sompapper.

au lieu de ... p> xxx pré>

Vous pouvez utiliser: p>

var configurationStore =
    new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
var mapper = new MappingEngine(configurationStore);
configurationStore.CreateMap<Dto.Ticket, Entities.Ticket>()


2 commentaires

Je ne connais pas les anciennes versions de FadifPPER, mais dans la version actuelle, la classe configuration est nommée ConfigurationStore .


Et la méthode Allmappers () est maintenant une propriété appelée mapper .



13
votes

En réponse à Luke Woodwwards 'S Commentaire sur la nouvelle syntaxe:

ConfigurationStore store 
   = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
store.AssertConfigurationIsValid();
MappingEngine engine = new MappingEngine(store);

//add mappings via Profiles or CreateMap
store.AddProfile<MyAutoMapperProfile>();
store.CreateMap<Dto.Ticket, Entities.Ticket>();


0 commentaires