Original article available at http://www.alphablog.org
vendredi 29 mars 2013
FDLV va lancer son application Windows Phone 7 !
Original article available at http://www.alphablog.org
Développement Windows Phone 7
Original article available at http://www.alphablog.org
Velocity, le cache distribué selon Microsoft
Velocity (nom de code du projet) est un principe de cache distribué qui peut être attaqué par des programmes .Net. Vous pouvez donc l'utiliser sur votre site Web, sur une application serveur distribué ou sur toute autre implémentation ... Il sera généralisé dans peu de temps afin de l'offrir aux développeurs mais se rendra aussi disponible sur Azure. Une fois l'installation effectuée (principe d'un maitre et de plusieurs esclaves), on peut alors manager le cache par un power shell. Selon les dire, il sera disponible une interface pour la sortie officielle. Pour le coté développement, on ajoute simplement les assemblies au projet pour utiliser le cache. C'est une cache de type "Key - Value" qui peut stocker n'importe quel type d'objet .Net. Il est bien sur disponible un procédé de duplication et de reprise sur erreur ainsi qu'un système de versionning basique pour gérer les "conflits" que l'on peut imaginer avec l'aspect distribué. Le plus intéressant dans ce projet est la vision future. Il sera bientôt possible de le requeter avec du LinQ. Il sera aussi possible de lui intégrer du code exécutif ce qui permettra de faire passer la couche d'accès aux données par ce cache... On peut alors imaginer que la persistance passera par cette cache qui se chargera automatiquement et "au besoin" de persister les données dans la base. La possibilité d'avoir un "cache client" qui déleste un peu le serveur et qui permet une application cliente plus rapide, plus réactive et avec moins d'accès au réseau. Pour l'instant c'est disponible par exécutable séparé mais la version assembly sera bientôt disponible. A cela s'ajoute la possibilité de brancher des évènements pour prévenir le client de modification sur le cache du serveur. Pour ce qui est du transport, le cache s'appuie sur la technologie WCF, il est donc possible d'y ajouter (par simple modification d'un fichier de configuration) toute les sécurités et protections proposés par WCF. (Article aussi posté sur www.homonerdicus.com)
Original article available at http://www.alphablog.org
Original article available at http://www.alphablog.org
Multiple jointures sur Oracle 10g avec NHibernate
Quelques posts parlent d'un bug survenant avec oracle 10g et NHibernate lors d'une jointure multiple.
- http://forums.oracle.com/forums/thread.jspa?threadID=412019&tstart=0
- https://forum.hibernate.org/viewtopic.php?f=1&t=963196&start=0
left outer join "City" city2_ on address1_.City_id=city2_.Id, "Country" country6_ left outer join Provider_Specialities specialiti3_ on provider0_.Id=specialiti3_.Provider_iddonc l'utilisation de provider0_.Id dans le second join est invalidé par le "," du premier join. Le code incriminé se situe dans le fichier Oracle10gDialect.cs dans NHibernate.Dialect. En voici son code :
public class Oracle10gDialect : Oracle9iDialect { public override JoinFragment CreateOuterJoinFragment() { return new ANSIJoinFragment(); } } Le workaround le plus simple à mettre en place est de changer le dialect de votre SessionFactory de Oracle10 vers Oracle9. Original article available at http://www.alphablog.org
Injecter des Mocks via IOC (NInject et Rhino Mocks)
Contexte
Dans notre projet de test, NInject est installé coté serveur. Il met en relation les différentes classes en garantissant un fort découplage. Arrive la partie des tests unitaires. Nous décidons de mettre Rhino Mocks afin de bien "unitariser" les tests. Seul problème, les dépendances sont injectées en cours d'exécution. Il faut donc demander à NInject d'injecter du Rhino Mocks. Les versions utilisés sont Rhino Mocks 3.6 et NInject 2.0 Compréhension par l'exemple : Exemple de classe métier injectée avec NInject :public class FileDAO : IFileDAO
{
[Inject]
private IFileDAL _fileDAL { get; set; }
public virtual File AddFile(string name, FileType fileType, byte[] contentFile)
{
//Some stuff here that use _fileDAL
}
public virtual bool DeleteFile(long index)
{
//Some stuff here that use _fileDAL
}
} Sur le code ci dessus nous remarquons que la variable _fileDAL est injecté par NInject (on le remarque par le tag [Inject]) lors de la création d'une instance de la classe. public void AuthenticateTest()
{
//Creation of the mock
IUserDAO = _userDAOMock = Repository.StrictMock()
//Usefull data for test
string login = "toto@toto.com";
string password = "titi";
Employee user = new Employee(login, password);
//Record what will be called and what will be returned
using (NInjectMockProvider.Repository.Record())
{
Expect.Call(_userDAOMock.GetEmployee(login, password)).Return(user);
}
//Start the "playback" feature.
using (NInjectMockProvider.Repository.Playback())
{
bool authOK = loginService.Authenticate(login, password);
//Verify that everithing has been properly called
_userDAOMock.VerifyAllExpectations();
//Check if the test is OK
Assert.IsTrue(authOK);
}
} Sur le code ci dessus, nous voyons les quelques étapes essentielles de l'utilisation de Rhino Mocks : - Mise en place des données de test
- Enregistrement du comportement du mock
- Lancement de la séquence de test
- Vérification que l'enregistrement correspond bien au comportement appelé et vérification des résultats.
IUserDAO _userDAOMock = Repository.StrictMock<IUserDAO>();Comme nous injectons aussi dans nos classes testées, il nous faudrait procéder à l'injection des mocks par NInject.
Don't fight NInject !
Pour paraméter l'injection, NInject s'appuie sur une classe dérivée de la classe abstraite NinjectModule ou il suffit de surcharger la fonction Load() afin de définir les bindings sous la forme :Bind<IUserDAO>().To<UserDAO>().InSingletonScope();Ninject nous donne la possibilité d'ajouter un "Provider" qui fournirait donc l'instance de la classe. L'utilisation parfaite dans notre cas serait :
Bind<IUserDAO>().ToProvider<NInjectMockProvider<IUserDAO>>();Nous indiquerons alors à NInject d'injecter un Mock pour des IUserDAO. Nous unifions donc le provider NInject avec la factory Rhino Mocks ! Que fait ce provider ?
public class NInjectMockProvider<T> : IProvider where T : class { //References to the MockRepository public static MockRepository Repository = new MockRepository(); //Static dictionnary that allow to create a Mock by kernel private static Dictionary<int, object> allItems = new Dictionary<int, object>(); public object Create(IContext context) { return CreateInstance(context); } //Say Ninject what type we are injecting public Type Type { get { return typeof(T); } } //Create the mock or return the mock already created private T CreateInstance(IContext context) { int temp = context.Kernel.GetHashCode(); if (!allItems.Keys.Contains(temp)) { allItems.Add(temp, Repository.StrictMock<T>()); } return allItems[temp] as T; } Ce qu'il faut retenir de ce provider-factory : - Il est configuré en injection Singleton by-design. Nous n'avons pas creusés plus loin, cela couvrait nos besoins
- Il simule auprès de NInject l'injection d'une classe abstraite
- Il s'occupe de la création des mocks typés.
Références :
Ninject Dojo Rhino Mocks documentationSpécial Thanks to :
Lionel Molas, pour le peer-programming qui nous a permit de trouver la solution ainsi que son idée de publier la solution !Original article available at http://www.alphablog.org
Inscription à :
Articles (Atom)