Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1

image

Et voilà ! Une année cloturée avec un beau projet utilisant Silverlight 3 et plus particulièrement le mode OutOfBrowser pour la partie applicative. Je souhaitais partager mon enthousiasme avec la communauté sur ce projet et démontrer ici qu’il était possible de construire une solution sérieuse dans le domaine médicale avec Silverlight 3… même en béta !

Définition du contexte :

La Clinique INSIA dispense un certain nombre de soins spécialisés, reposant chacun sur un matériel spécifique. La Clinique dispose d'un site internet, qui constitue à la fois une vitrine/interface avec les patients, mais devrait également constituer un puissant outil de communication/organisation en interne.

L’entreprise est installée à Paris ( XXe ) : c'est sur cet unique site que devront être déployées les applications ( hormis web, pouvant être placé chez un hébergeur ).

La Clinique se trouve aujourd'hui confrontée à des besoins, certes anciens, devant trouver une solution souple et efficace :

- capacité à communiquer efficacement, rapidement et massivement vers l'extérieur,

- centraliser et normaliser la communication et l'organisation en interne ,

- augmenter l'efficacité de taches ponctuelles par l'ajout d'outils spécifiques,

- améliorer l'efficacité de services en perfectionnant l'utilisation de certaines ressources.

imageTechnologies Utilisées :

- Visual Studio Team System 2008 et Team Foundation Server pour la partie gestion de projet, contrôle de code source, intégration continue et développement.

- SQL Server 2008 BI/Data : Intégration des codes postaux, des médicaments, mais aussi Analysis Services et Reporting Services

- Silverlight 3 béta pour la vitrine internet et applicative (mode out of browser) : Deux applications à réaliser .. une seule avec Silverlight 3, déploiement facilité pour l’applicatif client.

- WCF : Dans une solution hospitalière, il est préférable d’exposer nos fonctionnalités sous forme de service

réutilisable par d’autres applications.

 

Apercu de certains écrans :

Intégration Virtual Earth pour la géolocalisation :

image
Présentation des activités :

image
BackOffice avec persistence des crédentials dans l’isolated storage
image
Mode OutOfBrowser
image 
CrudViewModelBase et le pattern MVVM avec Silverlight 3 :

Le pattern MVVM apporte des vrais solutions d’architecture logicielle dans nos applications WPF ou Silverlight d’aujourd’hui, vous trouverez plein de liens à ce sujet sur internet notamment : http://msdn.microsoft.com/fr-fr/magazine/dd458800.aspx

Au cours du projet nous avons fait face à plusieurs écrans de Creation, Lecture, Edition, et Suppression d’une entité au sens Linq To SQL T4 :

- Traitement en local sur la collection d’entité (Ajout, Suppression, Modification ..)

- Utilisation de l’isolated storage et mécanisme de change tracking sur les entités en reflection

- Recherche

Faire une copie de la collection source :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private ObservableCollection<T> GetShallowCopy()
{
ObservableCollection<T> cloneList = new ObservableCollection<T>();

foreach (T item in CollectionOriginals)
{
object cloneItem = Activator.CreateInstance(typeof(T));

foreach (PropertyInfo property in item.GetType().GetProperties())
{
property.SetValue(cloneItem, property.GetValue(item, null), null);
}

cloneList.Add((T)cloneItem);
}
return cloneList;
}

Vérifier si une entité a été modifié :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private bool CheckIfModified(T canBeModifiedEntity, T originalEntity)
{
foreach (PropertyInfo pOfCanBeModifiedEntity in canBeModifiedEntity.GetType().GetProperties())
{
object propertyValueM = pOfCanBeModifiedEntity.GetValue(canBeModifiedEntity, null);
object propertyValueO = originalEntity.GetType().GetProperty(pOfCanBeModifiedEntity.Name).GetValue(originalEntity, null);

if (propertyValueM != null && propertyValueO != null)
{
if (!propertyValueM.Equals(propertyValueO))
{
return true;
}
}
}

return false;
}

Annuler les modifications :

1
2
3
4
5
6
7
public void UndoChanges()
{
ClearChangeTracking();
CollectionOfEntities = null;
SelectedItem = default(T);
CollectionOfEntities = GetShallowCopy();
}

Le but étant de travailler en local et de contacter le serveur seulement sur les entités impactés.

Dans les prochains posts je reviendrais sur d'autres aspects que je considère intéressant du projet...

Conclusion .. Silverlight Rulez :)

SharePoint 2007 : Bug du SP2, pensez à bien remettre votre licence post installation

Microsoft vient de communiquer sur son site produit SharePoint, la découverte d’un bug lié à l’installation du SP2 de SharePoint 2007. En effet, suite à l’installation de celui-ci, une date d’expiration de 180 jours est affectée.

Pensez donc bien à ressaisir votre clé SharePoint 2007 après votre installation dans l’administration centrale.

image

Office 2010 dont SharePoint Workspace 2010 et SharePoint Designer 2010 : Aperçu en image sur la toile

Leaked: Office 2010 Technical Preview screenshots

Alors que Microsoft commence à renforcer sa communication autour de Microsoft Office 2010,
et notamment suite à l’ouverture du site http://www.office2010themovie.com/, il semblerait
que certains sites, soient déjà en mesure de nous fournir plusieurs images de la
nouvelle suite bureautique de Microsoft, complétant celle de Janvier dernier.

Office 2010 contiendra donc Access 2010, Excel 2010, InfoPath 2010, OneNote 2010, Outlook 2010,
PowerPoint 2010, Project 2010, Publisher 2010, SharePoint Designer 2010, Visio 2010, Word 2010
et le fameux SharePoint Workspace 2010, remplaçant de Groove.

Pour apercevoir la nouvelle suite de Microsoft en image ainsi que SharePoint Workspace et SharePoint Designer 2010,
vous pouvez consulter le lien ci-dessous :

http://arstechnica.com/microsoft/news/2009/05/leaked-office-2010-technical-preview-screenshots.ars

D’après les menus présentés, on distingue tout de suite déjà un ensemble de fonctionnalités :

Visio 2010 : Possibilité d’importer ou exporter des workflows dans SharePoint.
Lier des données provenant de sources multiples à des formes. (SharePoint ? :) )

One Note 2010 : Possibilité de “Docker” son instance One Note.

Project 2010 : Présence d’une timeline représentant la progression globale du projet.

SharePoint Designer 2010 : Bouton de personnalisation du MySite

Microsoft Office SharePoint Service Pack 2 et Office 2007 SP2 disponible !

Le SP2 de SharePoint est disponible !

Il officialise notamment le support de IE8, apporte des améliorations autour de son intégration dans Firefox, mais aussi de l’authentification par formulaire…

Pour un descriptif complet, vous pouvez consulter des informations complémentaires sur le blog de Paul :)

Pour les plus impatients, vous trouverez ci-dessous les liens pour le télécharger :

2007 Microsoft Office servers Service Pack 2 (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyId=B7816D90-5FC6-4347-89B0-A80DEB27A082

2007 Microsoft Office servers Service Pack 2 (x64)

http://www.microsoft.com/downloads/details.aspx?FamilyId=B7816D90-5FC6-4347-89B0-A80DEB27A082

2007 Microsoft Office servers Language Pack Service Pack 2 (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyId=01C6A3E8-E110-4956-903A-AD16284BF223

2007 Microsoft Office servers Language Pack Service Pack 2 (x64)

http://www.microsoft.com/downloads/details.aspx?FamilyId=66C5026F-9F47-4642-8378-2526918009FA

 

De même pour la suite Office 2007 :

2007 Microsoft Office Suite Service Pack 2

http://www.microsoft.com/downloads/details.aspx?FamilyId=B444BF18-79EA-46C6-8A81-9DB49B4AB6E5

Microsoft Office Language Pack 2007 Service Pack 2

http://www.microsoft.com/downloads/details.aspx?FamilyId=E1203DB2-1CC9-4809-9B6E-3F232CB8899F

Pour du spécifique vous pouvez avoir une liste des mises à jour ici : http://support.microsoft.com/kb/968170/

Bon dl ;)

Microsoft Office System 2007 SP2 prévu pour le 28 Avril

Microsoft Update Product Team Blog vient d’annoncer la date de diffusion du SP2 de Office System 2007, vous trouverez un peu plus de détail sur les améliorations sur le billet suivant :

http://blogs.technet.com/mu/archive/2009/04/14/service-pack-2-for-2007-microsoft-office-system-due-april-28th.aspx

Potentiel de Surface ?

J’ai vu une vidéo assez sympa qui rend compte une fois de plus du potentiel de l’expérience Surface pour les applications de demain, et plus particulièrement ici pour l’industrie des jeux vidéos.

Je vous recommande vivement d’aller jeter un oeil à la vidéo de cette news pour le constater par vous même.

http://www.clubic.com/actualite-266228-ruse-preview-str-eugen-ubisoft.html

Même si le jeu n’est pas implémenté avec la table, ça reste sympa comme approche de gaming :)

Merci à Sylvain REVERDY de Winwise pour l’info :)

[Project Server 2007 / MOSS 2007] Extraire les WebParts et Pages Project Server 2007

Après une fraiche installation de Project Server 2007 et la création d’un projet, on constate :

- La création d’un espace projet basée sur le modèle de site SiteTemplates\PWS, en tant que sous site du site Project Web Access (SiteTemplates\PWA)

- La richesse des outils sur le site Project Web Access (SiteTemplates\PWA)

Pour plus d’informations sur ces sites, rendez-vous sur le billet suivant :

http://blogs.codes-sources.com/davidrei/archive/2009/03/19/project-server-2007-d-couverte-du-produit-et-installation.aspx

Nous allons donc voir très précisement les outils déployés par le modèle de site PWA.

Présentation du contenu PWA :

image

L’image ci-dessus montre l’arborescence du modèle de site PWA. On s’aperçoit que celui-ci copie des WebParts (contenu dans le repertoire DWP)

ainsi que des Pages (*.aspx) à la création d’un nouveau site de type PWA.

Une question se pose alors ; comment puis-je bénéficier de l’ensemble de ces fonctionnalités ?

1. Création d’une feature (Project Web Access Feature)

Pour réutiliser les élements du site PWA, j’ai donc tout naturellement encapsuler tous les éléments du modèle de site PWA dans une feature SharePoint.

Je réalise ensuite l’activation de la feature dans une autre collection de site, en dehors de mon espace PWA.

image image

Dés lors, si on essaye d’utiliser une WebPart, il se produit une erreur 401, et si on utilise une page comme

<Project.aspx>, on obtient l’ecran suivant :

image 

Pourquoi ? .. :(

2. Problème des WebParts

Un coup d’oeil rapide sur le dwp d’une webpart comme <QueueStatusPart> , nous permet d’identifier sa classe :

image

En ouvrant la classe <QueueStatusPart> depuis la dll <Microsoft.Office.Project.PWA.dll> située dans le GAC de notre serveur,

on s’aperçoit dans un premier temps, qu’elle hérite de PWAPart :

image

Puis, dans un second temps, la présence d’un attribut intéressant : <PSIUrl> sur la classe <PWAPart>

image

En redéployant ma WebPart mais surtout en spécifiant le PSIUrl comme ci-dessous, .. ma WebPart devient fonctionnelle :)

image 

Il nous reste donc plus que les pages :) ..

3. Problème des Pages

Pour résoudre le problème des Pages, j’ai utilisé le même raisonnement. Tout d’abord un coup d’oeil sur une de nos pages (Project.aspx) :

image

Mmmhh .. Elle hérite donc de PJBaseWebPartPage … mais encore ?

image

Notre constructeur de page cherche à récupérer l’identifiant du site PWA associé au contexte du site courant. Et GetPWASiteId ? ça fait quoi ?

image

GetPWASiteID utilise les propriétés du site SharePoint pour obtenir l’url ! C’est embêtant.. nous n’avons pas cette propriété car nous sommes dans un site standard..

Aucun problème rajoutons là :D :

image

Cet extrait de code me permet juste de recopier les propriétés de mon site projet PWA\Project dans un autre site. On obtient ensuite le résultat attendu.

En conclusion, il est possible de vous affranchir de la plateforme mise en place, et de construire la votre en vous basant peut être sur un existant. Pour ma part, il ne reste plus qu’à paramétrer toutes ces actions dans une feature un peu plus propre avec une gestion des configurations. Mais le concept est tout à fait réalisable.

[Project Server 2007] Découverte du produit et installation

image

Project Server 2007 apporte une vrai réponse aux problématiques d’industrialisation de la gestion projet. Il s’insère parfaitement dans un environnement SharePoint et profite de fait, de l’ensemble des briques proposé par celui-ci. Project Server 2007 est un produit à part entière même s’il profite largement des fonctionnalités de SharePoint, il apporte son lot d’API propre.

Pour réaliser l’installation du produit, je pars donc d’une machine avec un MOSS 2007 Entreprise, puis j’applique le programme d’installation de Project Server 2007. On remarque au passage que celui-ci ressemble fortement à SharePoint.
image

Dés lors, et dans notre SSP, on constate sous le groupe « Project Server », la présence d’un lien « Project Web Access Sites » qui permet de créer des PWA (Project Web Access).

Chaque PWA référence un groupe de projet. Une entreprise peut choisir de regrouper tous ses projets au sein d’un même site, ou bien de les regrouper par entité métier.

Le formulaire de création du PWA ci-dessous peut paraitre surprenant mais au final il nous demande juste où est-ce que nous souhaitons notre site et les noms des bases de données utilisées.

image

Une fois l’opération validée, on retrouve notre PWA dans la fenêtre récapitulative des différents sites :

image 

Sans plus attendre, voici le site PWA réalisé par Project Server :

image

On constate un ensemble de lien dont « Centre de ressources », qui va nous permettre de saisir les ressources sur l’ensemble de nos projets. L’ensemble des ressources est basé sur l’active directory utilisé par SharePoint. Il pourrait être intéressant de réaliser un utilitaire d’import massif de ressource pour un site PWA car renseigner les ressources peut devenir fastidieux.

image 

Pour déclarer nos projets au sein du site, il nous suffit d’ouvrir le lien « Centre de projets » pour constater qu’il est possible d’en ajouter ou de suivre l’ensemble :

image 

L’intéraction forte avec le client « Office Project Professional 2007 » permet d’un simple clic initialiser notre environnement Project sur lequel je me suis permis de renseigner les tâches suivantes :

image 

Pour établir la liste des ressources de mon projet, les composants Project Server me permettent de le faire très rapidement :

image

Après avoir affecté les tâches à toutes mes ressources, j’ai la possibilité de publier mon projet dans Project Server 2007 à l’aide du menu « File » puis « Publish ». Une fenêtre s’ouvre alors, celle-ci me demande un nom de sous-site pour mon projet.

image 

La publication de mon sous site est visible au sein de mon espace PWA :

image 

Et plus largement, nous avons aussi un PWS (Project WorkSpace) à l’adresse PWA/TestCodeSource»

image

En conclusion, Project Server est un acteur incontournable dans toutes entreprises qui souhaitent remédier aux problématiques de gestion projet.

Dans le prochain article vous verrez qu’il est possible d’inclure des fonctionnalités Project Server (WebParts et Page) dans votre site SharePoint traditionnel et comment le réaliser.

 

Techdays 2009 NAV201 - Implémenter WPF, Silverlight et Azure .NET Service Bus avec Dynamics CRM

Vous avez peut être assisté à la session NAV201 - “Découvrez comment combiner des développements WPF, Silverlight et Azure avec l'architecture orientée services de Microsoft Dynamics CRM” présentée par Daniel Tizon au Techdays 2009, session où j’ai participé en grande majorité avec l’aide de Gregory OTT à la réalisation du contenu technique dans le cadre de nos activités à Winwise. La session au Techdays 2009 proposait la gestion des séminaires depuis une application WPF.

Un heure c’est relativement court quand on souhaite communiquer sur l’ensemble de l’architecture, c’est pourquoi j’ai souhaité revenir vers vous pour partager mon expérience sur la combinaison d’un développement externe avec CRM dans le cadre de la solution de réservation des salles, la thématique de mes précédents posts.

Dynamics CRM expose un web service CRM permettant d’étendre les possibilités du produit vers l’extérieur.

Pour ma part je pense qu’il est indispensable d’encapsuler le web service au sein d’un service WCF afin de :
- Permettre une exposition à l’aide de Service Bus.
- Proposer une couche de service applicative enrichie.
- Normaliser l’architecture service.

Voici l’architecture projet d’une implémentation WPF et/ou Silverlight autour de Dynamics CRM.

image

La solution contient :

Un projet WPF et Silverlight qui référence une couche de service WCF (CrmBusinessPlatform.Run)

Un projet d’interface, d’implémentation des interfaces, et d’exécution du service.

Un projet qui permet d’échanger des entités entre les différentes couches. (DataContract sur la classe, DataMember sur chaque propriétés)

Le projet Libraries établit une référence au service CRM.



Fonctionnalité PolicyRetriever :

L'exposition de mon clientaccesspolicy.xml par WCF pour Silverlight est décrit dans l'article suivant : http://blogs.developpeur.org/davidrei/archive/2009/02/15/silverlight-wcf-exposer-le-clientaccesspolicy-xml-avec-wcf-et-rest.aspx

Structure du service CrmBusinessPlatform:

Le service suivant encapsule l'accès vers le web service CRM. Dans un soucis de performance de notre service, il est déclaré dans un contexte d'exécution unique
(InstanceContextMode = InstanceContextMode.Single). En effet notre instance vers le webservice est ici toujours active d'une requête à une autre.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[ServiceBehavior(Name = "Service", InstanceContextMode = InstanceContextMode.Single, Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CrmBusinessPlatformServices : ICrmBusinessPlatform, IPolicyRetriever
{
private CrmService _myService;
public CrmService CRMService
{
get
{
if (_myService == null) _myService = GetCrmService("CRM4");
return _myService;
}
}

#region ICrmBusinessPlatform Members
#endregion
#region IPolicyRetriever Members
#endregion

private CrmService GetCrmService(string organizationName)
{
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.OrganizationName = organizationName;
CrmService crmService = new CrmService();
// Same Computer WCF
// crmService.UseDefaultCredentials = true;
// Other Computers
crmService.UseDefaultCredentials = false;
crmService.Credentials = new System.Net.NetworkCredential("Administrator", "P@ssw0rd", "CRM4");
crmService.CrmAuthenticationTokenValue = token;

return crmService;
}
}

Récupérer la liste des salles :

Pour revenir avec la thématique abordée dans les précédents posts concernant la liste des salles dans CRM, nous pouvons dés lors ajouter la signature de la méthode suivante dans notre interface et l'implémenter comme ci-dessous :
Room étant un objet partagé par l'ensemble de notre solution.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public IEnumerable<Room> GetRooms()
{
QueryExpression query = new QueryExpression();

query.EntityName = "new_salle";

ColumnSet columns = new ColumnSet();
columns.Attributes = new string[] { "new_name", "new_salleid" };
query.ColumnSet = columns;

BusinessEntityCollection resultEntities = CRMService.RetrieveMultiple(query);

if (resultEntities != null &&
resultEntities.BusinessEntities != null)
{
foreach (new_salle n in resultEntities.BusinessEntities)
{
yield return new Room() { ID = n.new_salleid.Value, Name = n.new_name };
}
}
else yield break;
}

Enregistrer le service WCF sur .NET Service Bus d'Azure :

Notre service peut alors démarrer via service bus. L'approche est intéressante car elle permet de s'affranchir des problématiques d'infrastructure dans l'entreprise.
Celui-ci s'enregistre sur la plateforme service bus, puis d'un bout à l'autre la communication est rendu possible ici sur le binding
NetTcpRelayBinding.
Vous pouvez aussi utiliser le BasicHttpRelayBinding pour vos applications Silverlight.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
static void Main(string[] args)
{
#region Credentials

string solutionName = "X";
string solutionPassword = "X";

#endregion

// Définition de l'adresse du endpoint
Uri address = new Uri(String.Format("sb://servicebus.windows.net/services/{0}/NAV201-WCF/", solutionName));

// Création de l'objet d'authentification pour le endpoint
TransportClientEndpointBehavior userNamePasswordServiceBusCredential = new TransportClientEndpointBehavior();
userNamePasswordServiceBusCredential.CredentialType = TransportClientCredentialType.UserNamePassword;
userNamePasswordServiceBusCredential.Credentials.UserName.UserName = solutionName;
userNamePasswordServiceBusCredential.Credentials.UserName.Password = solutionPassword;

// Création du serviceHost
ServiceHost host = new ServiceHost(typeof(Service), address);
host.AddServiceEndpoint(typeof(ICrmBusinessPlatform), new NetTcpRelayBinding(), "");

// Ajouter l'objet d'authentification service bus à tous les endpoints spécifiés en configuration
foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
{
endpoint.Behaviors.Add(userNamePasswordServiceBusCredential);
}

// Ouverture du service
host.Open();

Console.WriteLine("Service address: " + address);
Console.WriteLine("Press [Enter] to exit");
Console.ReadLine();

// Fermeture du service
  host.Close();
}

Silverlight WCF - Exposer le clientaccesspolicy.xml avec WCF et REST

Au cours de mes developpements avec Silverlight et WCF, j'ai travaillé comme tout développeur de service pour Silverlight, sur l'implémentation du fichier "clientaccesspolicy.xml", afin de permettre la consommation de mon service par Silverlight.

Pour plus d'informations sur le contenu et la nature de ce fichier, je vous invite à consulter le site suivant : http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx

Je suis donc arrivé à la solution suivante :

Interface du service WCF :

1
2
3
4
5
6

[ServiceContract(Name = "IPolicyRetriever")]
public interface IPolicyRetriever
{
[OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
Stream GetSilverlightPolicy();
}

Cette interface associe une méthode sur l'adresse "/clientaccesspolicy.xml" de notre service.

Implémentation de l'interface :

On implémente alors l'interface de façon classique en retournant le contenu du fichier xml.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#region IPolicyRetriever Members

public Stream GetSilverlightPolicy()
{
WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";

string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers=""*"">
<domain uri=""*""/>
</allow-from>
<grant-to>
<resource path=""/"" include-subpaths=""true""/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>"
;

return new MemoryStream(Encoding.UTF8.GetBytes(result));
}

#endregion

EndPoint du service :

Il ne faut cependant pas oublier d'ajouter le endpoint qui va bien en (WebHttpBinding) et son behavior(WebHttpBehavior).

1
host.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());

Ayant travaillé avec d'autres méthodes d'exposition du fichier clientaccesspolicy.xml, celle-ci est, pour ma part, la meilleur. C'est pourquoi je souhaitais la partager avec vous.

Dynamics CRM : Solution de réservation des salles - Personnaliser le menu Dynamics CRM (Part 3)

Au cours du dernier post, nous avons (re)découvert l’outil Dynamics CRM 4 et ses possibilités offertes aux développeurs pour améliorer son extensibilité, puis nous avons modélisé nos entités dans le portail :

http://blogs.developpeur.org/davidrei/archive/2009/01/14/dynamics-crm-impl-mentation-d-une-solution-de-r-servation-des-salles-part-1.aspx
http://blogs.developpeur.org/davidrei/archive/2009/02/14/dynamics-crm-impl-mentation-d-une-solution-de-r-servation-des-salles-part-2.aspx

Pour envisager notre solution dans Dynamics CRM 4, il est nécessaire de penser « Intégration dans le produit ». Pour cela nous allons d’abord commencer à créer dans le menu de gauche de Dynamics CRM, une section spécialement réservée à notre solution de réservation.

La personnalisation du menu se fera en quatre étapes :

- Export du sitemap depuis CRM

- Modification du sitemap dans votre notepad préféré.

- Import du sitemap modifié.

L’export du sitemap se réalise dans le menu «Settings», «Customization», puis «Export Customizations». Dans la liste des entités, une sélection sur « Site Map » puis un clic sur « Export Selected Customizations» permet de télécharger un zip contenant le fichier xml du sitemap.

Le fichier « customization.xml » décrit naturellement les éléments de navigation de la forme suivante :

1
2
3
4
5
6
7
8
9
10
11
<SiteMap>
<Area Id="Workplace" ..>
<Group>
<SubArea Id="nav_cases" Entity="incident"/>
</Group>
<Group>…</Group>
</Area>
<Area Id=".." ..>
<Group>…</Group>
</Area>
</SiteMap>

Pour enrichir notre élément de navigation, vous l’aurez compris, il suffit d’ajouter son « area » en veillant tout de même que les identifiants soient uniques.

Nous ajouterons celui-ci :

1
2
3
4
5
6
<Area Id="RAR" Title="Reservation" Icon="/_imgs/ico_18_142.gif" >
<Group Id="RAR">
<SubArea Id="new_salle" Entity="new_salle" />
<SubArea Id="new_reservation" Entity="new_reservation" />
</Group>
</Area>

On peut bien entendu rajouter plusieurs groupes, en toute liberté :)

Une fois la modification effectuée, il suffit d’importer le fichier xml à l’aide de la fonctionnalité « Import Customization » dans le menu « Customization».

On obtient alors le résultat suivant :

image


Dans les prochains posts, nous irons encore plus loin dans la personnalisation et l’extensibilité en réalisant un accès avec WPF et Silverlight vers notre solution, et une exposition via Service Bus de notre service CRM.

Dynamics CRM : Solution de réservation des salles - Personnaliser les entités (Part 2)

Au cours du dernier post, nous avons découvert ou « redécouvert » pour certains, l’outil Dynamics CRM et ses axes d’extensibilité dans le cadre de l’implémentation de cette solution.

http://blogs.developpeur.org/davidrei/archive/2009/01/14/dynamics-crm-impl-mentation-d-une-solution-de-r-servation-des-salles-part-1.aspx

Il est temps maintenant de modéliser les entités que nous utiliserons dans notre application de réservation des salles.

Nous modéliserons ici, deux entités (Salle et Réservation) … pour faire simple.

Création de l’entité Salle :

Pour réaliser cette modélisation, nous utiliserons le menu « Settings » de gauche, puis « Customization » et enfin « Customize Entities ».

Etape 1 : Dans le menu supérieur, « New » nous permet de réaliser notre entité Salle, comme ceci :

image

 

 

 

 

L’appartenance (Ownership) permet de spécifier si la création d’une salle est spécifique à une « business unit » (Organization) ou à un utilisateur (User).  Ici elle fait bien partie des ressources de l’entreprise.  Au passage, nous pouvons cocher l’area « Workplace » en bas du formulaire, afin de visualiser notre entité dans  l’espace Workplace de CRM par la suite.

Etape 2 : Enfin, dans l’onglet « Primary Attribute », nous mettrons simplement comme identifiant le nom de la salle.

image

« Requirement Level », indique le niveau d’exigence sur ce champ.

Une fois l’opération effectuée, nous validons simplement les changements en cliquant sur « Save and close » dans le menu supérieur.

Notre entité « Salle » est alors terminée.

Création de l’entité Réservation :

Pour modéliser l’entité « Reservation », nous répétons les mêmes étapes que ci-dessus, avec le nom d’entité « Reservation ».

Mais avant de cliquer sur « Save and close », il nous faut définir les attributs supplémentaires de notre entité car celle-ci contient un peu plus d’information.

image










Une action sur le bouton « Save », permet de rendre disponible les personnalisations des éléments à droite et notamment dans notre cas, « Attributes » :

Dans la liste des attributs nous ajoutons :

- Date et heure de debut, DateTime, Date and Time, new_StartReservation
- Date et heure de fin, DateTime, Date and Time, new_EndReservation

Déclaration du lookup vers l’entité Salle :

Dans le menu de droite, il est aussi nécessaire d’ajouter dans les relations N:1, la relation vers l’entité Salle pour lier la réservation à une salle particulière.

image

Déclaration de la relation N:N avec une liste d’utilisateur :

Nous ajoutons aussi depuis le menu de droite, une relation N:N afin d’établir une relation avec les personnes qui seront rattachés à cette réservation.

image

Maintenant que nous avons les données de notre entité, il nous reste à définir le formulaire pour la saisie des données, encore une fois dans le menu de droite et en accédant à l’élément « Forms and view », puis Forms, vous obtenez un designer assez intéressant nous permettant de définir notre formulaire de création ou de modification de l’entité « Réservation »:

En utilisant le designer nous pouvons arriver facilement aux résultats suivants :

image clip_image002

De retour dans l’écran de personnalisation des entités, il faut ensuite cliquer sur « Publish », pour valider les changements dans l’ensemble de la plateforme CRM 4.

Après avoir réalisé cette opération, on peut apercevoir dans notre « Workplace », deux entités supplémentaires, avec une gestion du cycle CRUD, et des dépendances.

On remarque aussi la présence de la relation N:N dans le formulaire de création d’une Réservation,

image  

Pour conclure, nous avons bien avancé dans la construction de notre solution, puisque celle-ci prend désormais en considération, au sein de CRM, nos données métier.

CRM4 nous apporte la gestion d’un cycle CRUD avancé avec gestion des relations et dépendances, et propose même une recherche puissante au sein de nos données.

Dans le prochain post, je m’attacherai à démonter qu’il est possible de personnaliser le menu de CRM afin d’y intégrer les éléments de notre solution.

Dynamics CRM : Solution de réservation des salles - Présentation et Installation de Dynamics CRM (Part 1)

Ce post est le premier d’une longue série qui traitera de l’implémentation d’une petite solution de gestion des réservations des salles dans une entreprise, au moyen de Dynamics CRM. Dans cette première partie nous ferons juste une présentation rapide de l’outil et de ce qu’il propose aux développeurs.

Il aurait été intéressant de réaliser cette application avec CRM Online et la plateforme Azure mais malheureusement CRM Online n’est pas encore disponible pour nous français… Ce n’est que parti remise :) .. Stay Tuned :)

dynamicsMicrosoft Dynamics CRM, comme son nom l’indique, est l’outil phare de Microsoft pour répondre aux problèmatique liées à la gestion clients.

Dynamics CRM est aussi avant tout une plateforme de développement extensible, où l’on peut très rapidement par exemple modéliser un cycle CRUD puissant (Create, Read, Update, Delete), tout en profitant bien sur des fonctionnalités embarquées tel que le moteur de recherche natif du produit, ou bien encore le moteur de workflow sur les entités.

Il est important de préciser que le moteur de recherche Dynamics n’a rien à envier au moteur de recherche SharePoint, bien au contraire :)

Je ne traiterais pas ici de l’installation d’un serveur CRM, vous pourrez retrouver les différentes étapes au cours d’une vidéo commentée par John O'Donnell, à l’adresse suivante : http://channel9.msdn.com/posts/jodonnell/Microsoft-Dynamics-CRM-40--Installation-with-John-ODonnell/

Apercu du portail Dynamics CRM (Post installation) :

dynamics6

Si CRM apparait comme une solution de gestion client, l’extensibilité de CRM permet de dépasser cette limite, notamment grâce au :

Plugins :

dynamics1

Un plugin est une classe que l’on associe à un événement CRM. On retrouve finalement le même principe dans SharePoint avec les Receivers.

Autrement dit, à la création d’un élément dans une entité on va pouvoir exécuter du code métier qui va nous permettre d’orienter le fonctionnement du produit par rapport au processus métier de l’entreprise.

A noter que dans CRM, il est possible de déployer l’assembly du plugin dans la base de données, sa prise en compte dans l’application est immédiate.

Cette fonctionnalité serait plus qu’appréciable dans SharePoint

Workflows :

dynamics3

Il existe aussi un moteur de workflow dans CRM au niveau des entités, même si toutes les activités de Windows Workflows Fondation ne sont pas supportées, il a le mérite d’exister.

JavaScript :

Le JavaScript permet d’étendre le fonctionnement des formulaires d’édition très facilement en l’insérant dans le « designer » du formulaire.

dynamics4 dynamics5

Mais aussi …

Nous avons aussi la possibilité de consommer le WebService CRM, de créer des entités, d’intégrer des pages, de développer des Custom Controls..

Road Map CRM :

Dans CRM 5, nous disposerons d’un équivalent du WSP pour SharePoint afin de réaliser du déploiement de solution car ce n’est malheureusement pas le cas dans sa version 4, ou bien encore la fameuse ribbon bar ci dessous.

ribbon

Pour plus d’informations sur CRM 5, je vous invite à consulter le post suivant : http://demiliani.com/blog/archive/2008/11/11/6526.aspx

Conclusion :

Dans les prochains post, nous verrons comment modéliser l’application “Gestion des réservations” en mettant en œuvre les outils ci-dessus proposés par CRM. Plus particulièrement, le post suivant permettra de voir comment il est possible de s’approprier l’interface CRM pour héberger notre application.

Silverlight 2 et XLinq

Bonjour à tous !

Nouvelle et dernière année scolaire en Ecole d'Ingénieur, en ce qui me concerne... et cette année se passera au 3/5 à Winwise dans le pôle Collaboratif de Daniel Tizon, après presque deux ans d'expérience à Alsy, où j'ai eu la chance d'aborder principalement .NET 3.5, WSS, et MOSS 2007.

Afin de valider mes investigations autour de Siliverlight 2 (j'allais souvent de Hello World, en Hello World), ce mois-ci j'ai décidé de mettre en pratique Silverlight 2 autour d'un projet…  mon site perso, qui a pour but d'unifier mon blog FR (Codes-Sources) et mon Blog US, que je mettrais à jour très prochainement (retour des vacances !).

En effet, l'année prochaine, j'investirais beaucoup plus de mon temps dans la communauté CodeS-SourceS, et dans la communication de manière générale, afin de partager mes expériences , mes découvertes et mes interrogations avec vous.

Assez de blabla, voici donc mon premier projet Silverlight 2 (http://davidrei.net/), encore en chantier, des modifications sont notamment prévues tel que :

- Création d'un service WCF pour augmenter les possibilités d'évolution du portail.

- Amélioration de l'expérience d'installation de Silverlight en suivant les best practices MS que vous pourrez trouver à l'adresse suivante pour info : http://msdn.microsoft.com/en-us/library/bb882214.aspx.

- Harmonisation des billets, pour décrire le contenu FR et US.

Voilà, il ne reste plus qu'à partir en vacances !!! A bientôt chez Winwise pour certains et ici pour les autres :)

VSeWSS version 1.2

Les extensions Visual Studio 2008 pour WSS sont dispo !
 
Une petite liste des fonctionnalités :

Visual Studio 2008 Project Templates

  • Web Part
  • Team Site Definition
  • Blank Site Definition
  • List Definition
  • Empty SharePoint Project

Visual Studio 2008 Item Templates (items that can be added into an existing project)

  • Web Part
  • Custom Field
  • List Definition (with optional Event Receiver)
  • Content Type (with optional Event Receiver
  • Module
  • List Instance
  • List Event Handler
  • Template

Ma playlist des Techdays 2008 :)

ASP.NET MVC Preview 2

La version 2 des Asp.Net Extensions est disponible et embarque des nouvelles versions de notre ASP.NET MVC, mais aussi ADO.NET Services, ...

Je vous invite à consulter le site de Sébastien Carrière, pour plus d'infos !

ASPECTDNG et Concept

La programmation orientée objet est un concept très connu de nous tous, mais elle a cependant des inconvénients. L'héritage ne permet pas d'éviter complètement la duplication du code. Certains éléments de code sont même parfois impossible à centraliser, ce qui rend les choses beaucoup moins élégante et maintenable.

La programmation orientée ASPECT (AOP Programming) permet d'enrichir un modèle objet.

Prenons l'exemple d'une classe métier qui va gérer des produits.

public static class Product
{
public static void Order(...) { }

public static void Remove(...) { }

public static void Add(...) { }

public static void Update(...) { }
}

Nous souhaitons implémenter sur cette classe, l'aspect sécurité, la trace des actions effectuées, bref tout un tas de fonction de second plan par rapport à la fonctionnalité même! Oui oui la sécurité c'est important aussi, mais c'est pas le but de notre classe finalement... Alors certain me diront ok, très bien alors on fait une classe static, on la référence et on fait nos vérifications. Si on suit cette règle, notre classe métier référencera des composants techniques, chose qui n'est pas très très élégante, même si on trouve beaucoup de projet ainsi. La solution consiste à introduire deux aspects à notre classe, l'aspect sécurité, ainsi que l'aspect logging.

Réalisation avec ASPECTDNG pour la partie logging :

Le fonctionnement est sympa, il suffit de décrire dans un fichier les méthodes à tisser, ici nous allons tisser toutes les méthodes pour la trace.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" encoding="iso-8859-1" />
  <xsl:template match="node()">
   <xsl:copy>
    <xsl:copy-of select="@*" />
    <xsl:apply-templates select="node()" />
 </xsl:copy>
</xsl:template>
  <xsl:template match="Method">
   <xsl:copy>
    <xsl:copy-of select="@*" />
     <xsl:apply-templates select="Parameter" />
     <xsl:apply-templates select="Local" />
     <Instruction offset="-2" code="ldstr" operand="Ma Trace" />
     <Instruction offset="-1" code="call" operand="System.Console WriteLine(System.String)" />
    <xsl:apply-templates select="node()" />
 </xsl:copy>
</xsl:template>
</xsl:stylesheet>
 
Après la compilation, ASPECTDNG patch le code existant afin de réaliser les actions conformément au fichier ci dessus.
On a donc aucune dépendance dans notre code source, le code est plus élégant et plus maintenable .. Il nous faut juste déclarer nos actions dans le fichier ASPECTDNG.
 
La programmation par aspect est vraiment puissante lorsqu'on l'utilise de pair avec notre modèle objet classique, je vous invite fortement à étudier
ces concepts, pour ceux qui ne l'on pas déjà fait. Smile
 
D'autant plus que ce n'était vraiment qu'un aperçu très très mince de ses fonctionnalités. Angel

ASP.Net 3.5 Extensions

WSS, MOSS 2007 : SP1

Du nouveau sur WSS et SharePoint Server 2007, les SP1 sont en preview !! Cool

On y retrouve notamment :
  • Une compatibilité avec Microsoft AJAX 1.0 Control toolkit et AJAX 1.0 Extensions
  • La possibilité de réaliser des WebPart en utilisant Microsoft AJAX
  • Le support pour Windows Server 2008
  • Plus de 60 correctifs sur les produits
  • Des nouvelles commandes STSAdm
  • ...
Vous pouvez retrouver la liste complète ici
Plus de Messages Page suivante »

Les 10 derniers blogs postés

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 3 heures et 33 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le il y a 4 heures et 47 minutes

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le il y a 18 heures et 27 minutes

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le il y a 19 heures et 23 minutes

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le il y a 19 heures et 38 minutes

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15

- SharePoint : Gestion des Erreurs 6398, 7076 et 6482 par Blog Technique de Romelard Fabrice le 07-02-2009, 11:53

- EF avec WPF par Matthieu MEZIL le 07-02-2009, 10:18