mars
2009
Pour un petit spike maison, je suis en train d’évaluer les différents conteneurs IoC sur le marché pour le moment…
Mon besoin de base est tout bête, j’ai une classe Contact, qui ressemble a ceci:
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Une interface IContactRepository, implémentée par ContactRepository:
IList<Contact> GetAll();
}
public class ContactRepository : IContactRepository {
public IList<Contact> GetAll() {
return new List<Contact>{
new Contact{Id = 1,FirstName = "P.",LastName = "Vialatte"},
new Contact{Id = 2,FirstName = "C.",LastName = "Vialatte"},
new Contact{Id = 3,FirstName = "F.",LastName = "Vialatte"}};
}
}
Et au final, une interface IContactService et le ContactService qui va bien avec…
IList<Contact> GetContactList();
}
public class ContactService : IContactService {
private readonly IContactRepository repository;
public ContactService(IContactRepository repository) {
this.repository = repository;
}
public IList<Contact> GetContactList() {
return this.repository.GetAll();
}
}
Après pas mal de recherche je suis parti sur StructureMap, qui à l’avantage d’être :
- mature (la version actuelle est la 2.5.3, le projet existe depuis juin 2004)
- facile a configurer au niveau du code
- bien documenté, et pas trop verbeux coté XML (si on utilise XML)
StructureMap me proposer trois moyens de faire ce que je cherche à faire. Le premier, assez classique, est d’ajouter des données dans un fichier de configuration. Pour cela, il va me suffire de faire
<DefaultInstance
PluginType="DataAccess.IContactRepository,DataAccess"
PluggedType="DataAccess.ContactRepository,DataAccess" />
<DefaultInstance
PluginType="Business.IContactService,Business"
PluggedType="Business.ContactService,Business" />
</StructureMap>
Et au démarrage, StructureMap va aller récupérer les informations de mapping directement dans mon fichier xml.
Le deuxième moyen est de se baser sur des attributs. Cette méthode est passée par la fenêtre au bout d’une demi-seconde…En effet, celle-ci nécessite de décorer mes classes de cette manière :
public interface IContactService
{
IList<Contact> GetContactList();
}
[Pluggable(" Default")]
public class ContactService : IContactService {
private readonly IContactRepository repository;
public ContactService(IContactRepository dbo) {
repository = dbo;
}
}
…et je n’ai vraiment pas envie de changer mes classes pour un outil tiers
La troisième méthode est celle qui va utiliser le DSL de StructureMap pour créer le contexte d’exécution…
Et du coup, pour le moment, c’est celui que je préfères (attention, dans mon cas précis, ou je sais que je ne vais pas avoir, à court terme de besoin de jongler avec n implémentations)
En fait, il suffit que j’ajoute, au niveau de ma bibliothèque Business, une classe qui hérite de Registry, et qui va gérer le binding de mes IContactRepository a mon ContactRepository
public PersistenceRegistry() {
ForRequestedType<IContactRepository>().
TheDefaultIsConcreteType<ContactRepository>();
}
}
Et après, dans mon Global.asax, je peux ajouter
TheDefaultIsConcreteType<ContactService>(); }
Et les dépendances de mon application sont centralisées…
Et pour l’appel de mes fonctions ? C’est tout simple, quelle que soit la méthode choisie, il me suffit d’appeler l’objet ObjectFactory, qui va me renvoyer les bons types concrets, sans avoir a connaître les types sous jacents, comme ceci :
foreach (var contact in service.GetContacts()) {
Response.Write(contact.Name + " " + contact.Surname + "<br>");
}
Alors, c’est un peu brut de fonderie, mais qu’est-ce que vous en pensez ?
Est-ce que vous utilisez un outil dans ce genre (que ce soit Unity, Ninject, AutoFac ou Castle) ?
Articles récents
Archives
- janvier 2014
- septembre 2013
- août 2013
- mai 2013
- avril 2013
- janvier 2013
- août 2012
- juin 2012
- mai 2012
- avril 2012
- mars 2012
- novembre 2011
- septembre 2011
- août 2011
- juillet 2011
- juin 2011
- mai 2011
- avril 2011
- février 2011
- janvier 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009