2011-11-23 4 views
2

J'essaie de construire une application de base qui utilise des plugins afin que le noyau ne change jamais et chaque fois que nous obtenons un nouveau client, nous écrivons un module pour eux. Nous implémentons une interface appelée IClientPlugin avec la nouvelle classe de client. Ceci utilise le Framework 3.5 et Windows Mobile 6.5.3.Comment faire appel à une classe principale pour appeler une classe client?

Voici donc ce que je dois acheive:

c'est un système de gestion d'entrepôt. La première tâche consiste à recevoir dans le produit à partir d'un camion des codes à barres de numérisation des paquets avec l'appareil de poche.

Le module principal est lancé lorsque la personne clique sur l'élément de menu de réception.

la méthode de base est - callClientMethod()

Je sais que le nom du client et il est stocké dans une variable globale à l'ouverture et la classe sera {clientname}.cs et contiennent une méthode appelée processReceiving().

Je sais comment instancier cet objet.

La question est: existe-t-il un moyen de créer dynamiquement une instance de la classe client sans instructions de cas codées en dur? Par exemple, supposons que j'ai 2 clients Acme et Widgets. Par exemple, supposons que j'ai 2 clients Acme et Widgets. Si je me connecte en tant qu'Acme ou Widgets, je veux que le code crée dynamiquement une instance de la classe Client que j'ai connectée afin que le code de base ne doive pas changer comme j'ajoute plus de clients aussi longtemps que j'ajoute un module pour eux.

exemple psuedo:

var myClient = New (Clientname)(); 

Est-ce possible ou est-il une meilleure approche de conception ou est l'instruction switch/cas un mal neccessary?

+0

Les parenthèses d'angle sont mangées par le système et je l'ai remplacé par {{clientname} .cs'. N'étant pas un programmeur C#, je n'ai aucune idée si cela est acceptable pour indiquer le passe-partout. – Verbeia

+0

Je pense que les gens auront toujours le point grâce verbela. –

+0

Les classes client résident-elles dans le même assembly? – misha

Répondre

1

Vous pouvez utiliser la réflexion pour créer des objets de manière dynamique. Il existe plusieurs façons de charger un type ou un assemblage. Commençons par un simple:

Type clientType = Type.GetType("AssemblyName, TypeName"); 
IClientPlugin clientPlugin = 
        (IClientPlugin)Activator.CreateInstance(clientType);  

Si votre client est nommé myClient1 et vous avez la convention, que vos assemblées sont nommés comme par exemple Clients.ClientName.dll alors vous pouvez écrire une fonction:

IClientPlugin CreatePluginInstance(string clientName) { 
    string typeName = string.Format("Clients.{0}, {0}", clientName); 
    Type clientType = Type.GetType(typeName); 
    IClientPlugin clientPluginInstance = 
         (IClientPlugin)Activator.CreateInstance(clientType);  
    return clientPluginInstance; 
} 

EDIT

Si vos classes de plug-ins sont situés dans le même ensemble que votre ma dans le projet, vous pouvez simplifier l'appel de Type.GetType pour indiquer simplement le nom de classe:

Type.GetType(clientName); 
+0

Merci pour cela mais est-il un moyen de les réfréner dans le projet en dehors de DLL. J'essayais d'éviter de créer des usines à part entière, car il y a de jeunes développeurs qui devront maintenir cette situation et qui ne maîtrisent pas encore les principes avancés du .net. –

+0

Je ne sais pas ce que vous voulez dire par * projet en dehors de DLL *. Pourriez-vous préciser ceci? – Jan

+0

oui la classe que je référence n'est pas dans un dll c'est dans un sous répertoire du projet je travaille dans –

0
var myClient = Activator.CreateComInstanceFrom("Acme.dll","Acme"); 

Où paramétrer le nom et l'Assemblée le nom du type.

+0

Merci pour cela, mais est-il un moyen de les réfréner dans le projet en dehors de dll. J'essayais d'éviter de construire des usines à part entière car il y a de jeunes développeurs qui vont devoir maintenir cela et qui n'ont pas encore une compréhension complète des principes .net avancés. –

Questions connexes