05/10/2009

WCF, charger dynamiquement tout les services configurés dans system.serviceModel

Voici un exemple de code qui vous permet de charger dynamiquement tout les services définit dans la section system.serviceModel de votre fichier app.config.
Ce code est inspiré par celui de Ingo Start ServiceHosts for all configured Services.
Dans l'exemple présent, on considère que les services sont contenus dans une assembly externe. Pour récupérer le type du service il faut donc construire son nom de type avec la forme "completeTypeName,assemblyName", ce qui est fait par le code
String sServicesAssembleName = appSettings.Settings["ServiceAssemblyName"].Value.ToString();
String sTypeName = String.Format("{0},{1}", srvElem.Name, sServicesAssembleName);
Voici le code complet :

// Get the configuration file.
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
System.Configuration.AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
String sServicesAssembleName = appSettings.Settings["ServiceAssemblyName"].Value.ToString();
//Get the appSettings section.
ServiceModelSectionGroup SrvModel = (ServiceModelSectionGroup)config.GetSectionGroup("system.serviceModel");
foreach (ServiceElement srvElem in SrvModel.Services.Services)
{
String sTypeName = String.Format("{0},{1}", srvElem.Name, sServicesAssembleName);
Type typeService = Type.GetType(sTypeName);
if (typeService != null)
m_ListServiceHost.Add(new ServiceHost(typeService));
}

foreach (ServiceHost host in m_ListServiceHost)
{
host.Open();
}

Aucun commentaire: