Découvrir Exchange Web Services EWS Managed API

Nuget Ews Managed API

A travers de cet article, je veux commencer une série de tutoriels autour de développement Exchange, principalement les web services managés (EWS Managed API).

EWS Managed API est une bibliothèque c# permettant d’interagir avec un serveur Microsoft Exchange. Elle simplifie beaucoup l’interrogation et le traitement des données des boîtes aux lettres Exchange.

Vous pouvez trouver tous ce qu’on peut faire avec EWS ici.

  • Prérequis pour utiliser EWS Managed API

Pour commencer à developper avec EWS Managed API, vous devez avoir:

  1. Une boîte aux lettre Exchange hébergée sur un serveur Exchange (2007 SP1 ou plus) On-Premise, Online ou Office 365.
  2. Visual Studio avec Framework .Net 3.5 ou plus.
  3. La bibliothèque EWS Managed API (Disponible sur Nuget).
  4. Connaissance de base en développement Web service (code managé)
  • Connexion aux web services Exchange avec EWS Managed API

Comme plusieurs bibliothèques, EWS Managed API dispose d’une classe principale permettant l’initialisation d’une connexion aux web services.

Nuget Ews Managed API
Nuget Ews Managed API

Ci-dessous une méthode simple pour initialiser la connexion:

exchangeVersion: Version du serveur Exchange interrogé

ewsUrl: Url de publication des web services Exchange

ewsTimeOut: TimeOut de la connexion EWS (en millisecond)

ewsUser: Nom d’utlisateur de la connexion EWS

ewsPassword: Mot de passe de l’utlisateur

domainName: Nom du domaine

Par la suite vous pouvez utiliser cette méthode pour interroger une boite aux lettres Exchange comme suit:

 

C# Tips and Tricks : Utilisation de mot clé YIELD

images

Grâce au mot-clef yield, vous pourrez créer des itérateurs typés très facilement.

Si par exemple vous avez une une méthode retourne une collection d’élément, le mot clé yield vous permet de retourner cette collection automatiquement sans besoin de créer une collection temporaire.C’est le compilateur s’occupe de générer le code nécessaire…

Voici un petit exemple illustrant l’utilisation de yield:

internal static IEnumerable<object> GetOpenedItems()
{
 foreach( object item in FullListItems )
 {
 if( IsItemOpened(item) )
 yield return item;
 }
}


 

Les 6 erreurs à éviter quand vous répondez à une offre d’emploi

promotion-candidature

Un CV doit être comme la robe d’une jolie femme. Assez long pour couvrir l’essentiel, assez court pour rester intéressant

Répondez à un offre parait une tâche très simple mais beaucoup des gens ne font pas attention à certains point critiques que je les cite ci-dessous. Soyez sur que certaines faute redirige directement un candidature vers la corbeille. Alors, faites gaffe!!!

Cette liste s’adresse à tout le monde dans tout les domaines.

  1. Ne jamais envoyer votre dossier depuis le mail d’un cousin.
  2. Ne jamais compresser votre dossier, par mesure de sécurité, le recruteur n’ouvre pas les fichiers compressés…
  3. L’objet de candidature est très importante. Dans certains cas, selon l’objet de candidature, un mail sera directement rejeter…
  4. Pour les tunisiens principalement, essayer toujours d’envoyer vos candidatures vers le mail de recruteur directement si possible, et ne pas passer vos dossiers à travers des sites tiers (comme tanitjobs…), ces sites demandent généralement au recruteurs de s’inscrire/se connecter par la suite…
  5. ça sert à rien de joindre une lettre de motivation si ce n’est pas demandé. Par contre la soigner bien dans le cas contraire!
  6. N’oublier pas les offres à lesquelles vous avez postulé, vous pouvez les noter dans votre bloc-note.

Je reviens vers vous avec un autre article contenant une checkList pour bien préparer un CV.

 

Tips and Tricks: Optimiser un service web WCF Part 1

Capture

C’est vrai que en tapant quelques mot clés sur Google on peut trouver plein des documentations, des articles, des discussions sur des sujets très pointus, ça nous fait gagner parfois des longues journées de travail. Ce que n’est pas bien parfois (ou même souvent), et en passant sur un billet StackOverFlow par exemple, c’est d’appliquer des solutions ou prendre des décisions sans même poser la question POURQUOI il faut faire comme ça ? Et ici, on l’expérience fait la différence.

Dans ce cadre je partage avec vous ma recette dans le développement des web services, principalement avec la technologie Microsoft WCF.

Ces sont des (bonnes) pratiques qui peuvent être utiles dans la majorité des cas, mais ça reste toujours des cas particuliers qu’on doit s’orienter vers d’autres pratiques…

  1. Un Service Web doit être sécurisé, fiable, robuste et Thread-Safe.
  2. Un Service Web ne doit pas bloquer son client pendant longtemps.
  3. Placer les services web dans une bibliothèque de classes à part et non pas dans un exécutable
  4. Ne pas implémenter des constructeurs avec des paramètres pour la classe d’un service
  5. Donner des noms pertinents pour les contrats des services. Pour les services exposés en externe, utiliser l’URL de votre entreprise avec l’année et le mois pour soutenir le versionning. Par exemple :

[ServiceContract(Namespace = « http://www.dotnet-practice.com/2015/03 »)]

interface IMyContract

{…}

Pour les services internes (Intranet), utiliser des noms significatifs et uniques telque :

[ServiceContract(Namespace = « MyApplication »)]

interface IMyContract

{…}

  1. Nommer toujours les EndPoints dans le fichier config de client.
  2. Ne pas utiliser SvcUtil pour générer le fichier de config.
  3. Nettoyer le proxy avant de le générer.
  4. Ne pas dupliquer le code de proxy, si plusieurs clients utilisent le même contrat, factoriser le proxy dans une bibliothèque de classes à part.
  5. Toujours fermer ou disposer le proxy.
  6. Eviter les opérations qui semblent à des propriétés.
  7. Eviter les contrats avec un seul membre.
  8. Ne pas dépasser une vingtaine de membres dans un contrat de service.
  9. Utiliser l’attribut DataMember seulement sur les propriétés ou les membres publics en lecture seule.
  10. Eviter la sérialisation XML explicite sur vos propres types.
  11. Lorsque vous utilisez la propriété Order, affecter la même valeur à tous les membres provenant du même niveau dans la hiérarchie de classes.
  12. Implémenter IExtensibleDataObject dans vos contrats, ça vous facilite beaucoup la mise en place des nouvelles versions d’un service par la suite.
  13. Ne pas mettre IgnoreExtensionDataObject à true des attributs ServiceBehavior et CallbackBehavior. Laisser les valeurs par défaut surtout les des services web classique. (On détaille plus dans quel cas on utilise ces attributs dans les prochains articles)
  14. Ne pas marquer des délégués ou des événements comme des DataMember

 

 

 

C# Generic Reflection: Convertir une condition String en Lambda Expression

images

Est-ce que vous avez été devant la problématique où vous devez construire votre Expression Lambda dynamiquement?

La solution est simple, il suffit de jeter un coup d’œil sur que est ce que nous offrent les bibliothèques de Réflexion du Framework .Net.

La réflexion fournit des objets qui décrivent les assemblys, les modules et les types. Vous pouvez utiliser la réflexion pour créer dynamiquement une instance d’un type, lier le type à un objet existant ou l’obtenir à partir d’un objet existant et appeler ses méthodes ou accéder à ses champs et propriétés. Si vous utilisez des attributs dans votre code, la réflexion vous permet d’y accéder. Pour plus d’informations, consultez Réflexion (C#).

Notez que l’exemple de code suivant ne fonctionne que pour l’opérateur d’égalité (==). Cependant, il est facile de généraliser le même principe sur d’autres opérateurs.

internal static Func<T, bool> StringToEqualLambdaExpression<T>(string condition)
{
// convertir la condition
var conditionSplitted = condition.Split(new string[] { "==" }, StringSplitOptions.None);
var propertyName = conditionSplitted[0].Trim();
var value = conditionSplitted[1].Trim();

// construire l'expression lambda
var arg = Expression.Parameter(typeof(T), "c");
var property = typeof(T).GetProperty(propertyName);
var comparison = Expression.Equal(
Expression.MakeMemberAccess(arg, property),
Expression.Constant(value));
//compiler l'expression lambda
return Expression.Lambda<Func<T, bool>>(comparison, arg).Compile();
}

Test:

List<Contact> contacts = new List<Contact>();
contacts.Add(new Contact() { Prenom = "Sami" });
contacts.Add(new Contact() { Prenom = "Salim" });
contacts.Add(new Contact() { Prenom = "Ali" });

var result = contacts.Where(StringToEqualLambdaExpression<Contact>("Prenom == Ali"));

MorphX : Comment créer un Form sous Dynamics AX 2012 en se basant sur un Form Modèle

microsoft-dynamics-ax_2012

Parmi les principaux objectifs dans Dynamics AX 2012 était d’augmenter la productivité d’un développeur en automatisant les tâches courantes. Dans le cadre de cette initiative, une nouvelle fonctionnalité a été introduite dans Dynamics AX 2012 dans l’AOT. Il s’agit de la création de nouveaux formulaires à l’aide de modèles de form.

Si vous faites un clic droit sur ​​le nœud Form, vous pouvez voir une option supplémentaire là: Nouveau form de modèle

FormTemplate

Comme on le voit dans l’image ci-dessus, vous avez la possibilité de créer huit form différent, basée sur les modèles pré-définis, ceux-ci sont

  • ListPage
  • DetailsFormMaster
  • DetailsFormTransaction
  • SimpleListDetails
  • SimpleList
  • TableOfContents
  • dialogue
  • DropDialog

Maintenant, vous pouvez concevoir vos forms d’une manière très simple tout en restant dans les normes proposées par Microsoft.

La vidéo suivante vous montre pas à pas comment créer un nouveau form en se basant sur un modèle déjà existe dans Microsoft Dynamics AX 2012. Et puis, comment ajouter une source des données et insérer des nouvelles données.

MorphX : Comment créer un Form sous Dynamics AX 2012 en se basant sur un Form Modèle

Comment créer un EDT et une table sous Microsoft Dynamics AX 2012

microsoft-dynamics-ax_2012

Bonjour!

Avant de commencer la présentation de ce toturiel, je vous présente le fameux ERP Microsoft Dynamics AX 2012.

Dynamics AX est un système hautement personnalisable et nécessite une quantité importante de connaissances et d’expérience pour fournir des solutions de qualité. Un objectif peut être atteint de plusieurs façons et il ya toujours la question de savoir quelle est la meilleure façon.

« Microsoft Dynamics AX est une solution métier destinée aux entreprises internationales qui prend en charge des processus métier sectoriels et opérationnels, ainsi qu’une fonctionnalité ERP complète pour la gestion des ressources humaines et financières. Cette solution permet à vos employés d’anticiper le changement et de l’adopter pour développer votre entreprise. »*

Source: http://www.microsoft.com/fr-fr/dynamics/erp-ax-overview.aspx

En tant que développeur Dynamics AX, ma responsabilité est de fournir toutes sortes de personnalisations d’application, que ce soit un petit ajustement ou un module sur mesure. Je suis en novice sur cette plateforme mais je vais essayer de partager mes connaissances avec vous sachant que il n’a y pas beaucoup du documentation sur internet (à part la documentation officielle de Microsoft).

J’ai préparé un vidéo d’environ 5min pour vous montrer par quoi j’ai commencé lors de ma auto-formation.

Il y a aussi quelques points à clarifier et qui concernent Dyanmics AX 2012:

  • La base de données est MS SQL Server 2008/2012
  • Les relations entre les tables de la base de données sont gérées coté AOS (Application Object Server), donc le schéma de la base de données dans SSMS ne montre rien à part les tables.
  • Vous pouvez trouvez certains diagrammes de modèles de données ici.
  • La création des tables, des attributs , des clés primaires et des relations entre les tables se fassent tous coté AOS à l’aide de l »espace de travail de développement.
  • Toute modification qui touche le modèle de données n’a effet qu’après la synchronisation de la base de données.

Le vidéo suivant (niveau débutant) montre comment créer une table après avoir créer un EDT (Extended Data Type).

Comment créer un EDT et une table sous microsoft Dynamics AX 2012