Archive

Posts Tagged ‘InheritedExport’

A quoi peut vraiment servir l’attribut PartNotDiscoverableAttribute ?

La plupart d’entre vous connaissent déjà la réponse. Si vous ne la connaissez pas, cet attribut sert à exclure une Part (extension) de la liste des exports qui seront visibles.

Lorsque j’ai découvert cet attribut, je me suis dit quelle est vraiment son utilité. Si on ne veut pas exporter une Part autant ne pas la décorée de l’attribut Export et le tour est joué.

Pour voir où l’attribut PartNotDiscoverableAttribute joue un rôle important, passons à la pratique.

Supposons que nous ayons les classes EmailSender, SecureEmailSender et SMSSender qui feront office d’extension. Toutes ces extensions implémentent l’interface IMessageSender.

Pour ne pas avoir à décorer chacune des classes citées précédemment avec l’attribut Export le plus simple est de décorer l’interface IMessageSender avec l’attribut InheritedExport et toutes les classes implémentant cet interface seront définies automatiquement comme des extensions.

Ainsi nous aurons le code suivant :


[InheritedExport(typeof(IMessenger))]
public interface IMessenger
{
	void Send(string message);
}

public class EmailSender : IMessenger
{
	#region IMessenger Membres

	public void Send(string message)
	{
		Console.WriteLine("Email sender : {0}", message);
	}

	#endregion
}

public class SecureEmailSender : IMessenger
{

	#region IMessenger Membres

	public void Send(string message)
	{
		Console.WriteLine("Secure Email sender : {0}", message);
	}

	#endregion
}

public class SMSSender : IMessenger
{
	#region IMessenger Membres

	public void Send(string message)
	{
		Console.WriteLine("SMS sender : {0}", message);
	}

	#endregion
}

Jusque là pas de problème. Nos extensions sont utilisées durant plusieurs années et un jour il est décidé que l’extension EmailSender ne doit plus être utilisée et donc ne doit plus être exposée ;).
Plusieurs solutions s’offrent à nous :
– Retirer la classe EmailSender du code
– Ne plus utiliser l’attribut InheritedExport défini sur l’interface IMessageSender, mais plutôt utiliser l’attribut Export sur les différentes extensions devant être exposées et ignorer la classe EmailSender

Pour une petite librairie comme celle de l’exemple pas de problème. S’il s’agit d’une grande librairie et que plusieurs extensions doivent être exlues les solutions citées précédemment peuvent devenir vite fastidieuses et entraînées des erreurs.
Le plus simple est de noter les extensions à exclure. Une fois cela fait, modifier le code en décorant chaque extension à exclure (EmailSender dans notre exemple) par l’attribut PartNotDiscoverableAttribute. Avec cette méthode le risque d’erreurs est réduit.

[PartNotDiscoverable()]
public class EmailSender : IMessenger
{
	#region IMessenger Membres

	public void Send(string message)
	{
		Console.WriteLine("Email sender : {0}", message);
	}

	#endregion
}

Nous voyons que l’attribut PartNotDiscoverable est d’une grande utilité contrairement à ce que je pensais au début :D.

Catégories :Silverlight, WPF Étiquettes : , , , ,
%d blogueurs aiment cette page :