Simon BUDIN
Agence de marketing et communication digitale
Travaux
Clients
Objectif pour Canal+ : remplir sa base de données d'emails
Récupère les prospects, peut déterminer si un prospect est valide
Développe le jeu et les services associés
Amène des joueurs sur le jeu grâce à des sites affiliés
CANAL+ doit rémunérer TradeDoubler pour les inscrits au jeu qu'il ne connaissait pas déjà.
Il faut donc régulièrement fournir à TradeDoubler une liste des personnes valides du point de vue de Canal+
Service Windows tournant chez RAPP sur le serveur du jeu
3 actions quotidiennes principales :
génère la liste des inscrits du jour et l'envoie à Canal+ récupère la liste transformée par Canal+ (statuts "déjà inscrit Canal+") génère une liste pour TradeDoubler (leads valides) et lui envoieLes fichiers envoyés sont des fichiers csv et xml sur des serveurs ftp
Fichiers envoyés sur des FTP
CSV "IN" généré et envoyé à Minuit CSV "OUT" reçu vers 12h10 XML généré à la volée (jointure entre csv "OUT" et base locale)Contrôler la création et les échanges de fichiers
En maintenant à jour une liste de "Bundles" et de "BundleFiles"
Groupe de 3 fichiers quotidiensCsv "IN", Csv "OUT" et Xml
Par opposition à "Model First" et "Database First"Méthodologie ORM fondée sur le code
POCO DbContext Conventions Implémentations WorkflowPlain Old CLR Object
Aucune référence à l'ORM (ou presque)
Brique de base d'EF
Représente une session d'accès à la base de données
On y définit les objets à persister et certains réglages
On hérite de DbContext
Un DbSet par table
Code First détecte les clefs grace à des conventions de nommage par défaut
On peut modifier ces conventions si besoin
Propriété Int ou Guid de format "<NomClasse>Id"
Il est conseillé de fournir la clef de l'entité liée en plus de la collection
Format : "<NomClasseLiee>Id"
Les attributs : Key, StringLength, NotMapped, Required
Il en existe d'autres
La fluent API : contraintes définies en redéfinissant OnModelCreating dans le contexte
Permet des modifications plus poussées
Permet également de ne pas trop "salir" les POCO
Create Bundle
Get & List Bundles
Create Bundle Files
Une migration décrit le différentiel dans la base de données par rapport à la migration précédente.
Modification du modèle = Migration
A ne faire qu'une fois
La méthode Seed peut être utilisée en dev pour préremplir des données
Met à jour la base de données
Insert une entrée dans la table __MigrationHistory
Paramètres utiles de Update-Database
La ConnectionString porte le nom du contexte Mais on peut modifier ça :
Si pas de ConnectionString valide trouvée -> LocalDb
L'initializer peut être utile si on veut laisser le moteur créer la base au besoin...
On peut régler le lazyloading et la création de proxies.
Pour éxécuter les commandes
1. Projet de démarrage = avec connection string
2. 'Défault project' dans PMC = celui du DbContext
Api RESTFul en .NET
Routing & Actions Formatters Filtres d'actionIl dicte quelle action effectuer dans le contrôleur
Mapping HTTP to Action (msdn)
1. Dans WebApiConfig (similaire à ASP.NET MVC)
L'action est déduite par le moteur grâce au verbe HTTP
Appelée avec /api/bundles/
GET + pas de paramètre = action retournant un IEnumerable
GetAllBundles
2. Par attribut
Appelée avec /api/bundlefiles/[path/to/file.ext]
GET + Paramètre "path" = type de retour object
Paramètre path de type "catch-all" mappant le filepath
GetBundleFileContent
Web API fournit permet de paramétrer les types Mime
On peut définir ses propres formats : par exemple csv
C'est le client qui choisit, avec le header HTTP 'Accept'
(AngularJS permet de modifier ce header)
Accept: application/xml
Accept: application/json = JSON
On peut supprimer un Formatter
On peut indenter le JSON (pas par défaut)
Permettent d'éxécuter du code par nature transverse :
Logs, authentification, check de session, gestion des exceptions...
Filtre d'autentification
On hérite de BasicAuthenticationFilter qui hérite de AuthorizationFilterAttribute (prédéfini)
Ce filtre scanne les headers HTTP à la recherche d'info d'authentification
On peut appliquer des filtres comme dans ASP.NET MVC à plusieurs niveaux
Filtre en global
rappMonitor / rBIu435E1aC581Controllers, Services, Directives ne sont que des fonctions javascript qu'on ajoute à un module
Tout est donc facilement testable
L'objet $scope est géré par AngularJS : c'est une sorte de view-model, zone d'échange entre vues et controleurs
On ne manipule pas le DOM hors de la vue, uniquement le $scope
Nous allons avoir besoin de définir :
MVC ? MVVM ? MVW !
Le module principal dans app.js
Le controleur
Dépendances à $scope et bundleService injectées
Le service renvoie un objet de type "promesse"
On charge les scripts
On définit la zone d'influence d'Angular
Le $scope ne pourra être bindé que dans cette section du DOM
Utilisation du scope dans la vue
Que de directives !
Les directives permettent d'étendre HTML
Elles peuvent représenter de simples fonctionnalités css
Ou permettre de boucler et filtrer une liste
Enfin elles peuvent servir de vue partielle
Elles permettent de paramétrer l'affichage d'éléments en fonction d'une valeur booléenne du $scope
ng-repeat repète les éléments d'un tableau du $scope
On peut imbriquer les boucles
Et filtrer une liste via une valeur du $scope à la volée
Vue partielle pour un Bundle
Le code est rendu très lisible
On peut combiner les directives entre elles
On passe l'objet bundle dans l'attribut "which"
Définition de la directive
L'attribut restrict 'E' définit le type Element
TemplateUrl permet de définir le chemin de la vue partielle
Cette directive encapsule son propre scope
La notation "=which" retrouve l'objet du scope parent
Par défaut une directive utilise le scope du template parent...
sauf si on en définit un comme ici
le '=which' lie la valeur 'bundle' de ce scope à la valeur 'bundle' du scope parent
Fichier bundle.partial.html
{{value}} est une 'expression', évaluée dans le scope courant
On peut charger d'autres directives dans le template
Il permet d'encapsuler les appels API
C'est une bibliothèque réutilisable
Le bundleService
Le service expose 3 fonctions
On injecte le module $http pour l'Ajax
Le module $q permet une gestion asynchrone élégante
Fonction GetBundles en détails
Fonction GetBundleFileContent
Cette présentation est disponible à l'adresse suivante : https://github.com/BlueInt32/prez
Code first to new Database @ Msdn.com
Getting Started with Web Api 2
Graphiques : LucidChart
Versionning : Git + Github
Présentation HTML : reveal.js + nodeJS
SublimeText 3
Visual Studio 2013
Adobe Photoshop CS6