2010-07-16 11 views
1

Dans notre projet, nous avons implémenté une facilité simple pour permettre à une partie de publier des composants dynamiques et d'autres, pour les consommer. Je voudrais éliminer progressivement notre implémentation interne et préparer quelque chose de prêt à l'emploi. Puisque nos gars de l'interface utilisateur utilisent déjà Caliburn + Prism + Unity, j'ai décidé d'aller avec Unity (avoir deux implémentations de conteneurs IoC différentes semble être une chose étrange à faire).Comment utiliser Unity pour implémenter un simple moteur de publication de composants

Par souci de la question, voici les joueurs:

  1. types d'entité (A, B)
  2. usines entité (FactoryA, FactoryB)
  3. Gestionnaire d'entités (Manager)
  4. Client

À partir de maintenant, Manager a RegisterFactory(IFactory) API, qui est le seul moyen d'enregistrer de nouveaux types d'entités - on doit l'appeler en passant la nouvelle instance d'usine d'entité.

Toutefois, les appels explicites à cette méthode par le client sont rares, car le Manager exécute notre moteur interne, qui examine tous les assemblages dans un dossier donné et les charge, ce qui permet de déclarer certains attributs de niveau d'assemblage. L'attribut spécifie le type de fabrique d'entité particulière, de sorte que le moteur peut l'instancier (en utilisant Activator.CreateInstance) et appeler l'API RegisterFactory.

En outre, le moteur surveille le dossier et sait charger de nouveaux assemblages à la volée.

Par exemple, si C est un nouveau type d'entité mis en œuvre dans un ensemble Foo.dll, l'assemblée doit avoir un attribut de niveau assebly comme ceci:

[assembly: PublishEntity(typeof(FactoryC))] 

Ensuite placer Foo.dll dans ce dossier spécial provoque le moteur:

  1. examiner et y trouver l'instance attribuer le niveau d'assemblage pertinent
  2. Créer une nouvelle instance à l'aide FactoryC réflexion
  3. Appelez Manager.RegisterFactory, en passant l'instance FactoryC en tant qu'argument.

Le point est que je souhaite utiliser Unity pour obtenir la même fonctionnalité.

Des idées?

Merci.

EDIT

Les deux types Manager et l'usine sont nécessaires. Ce que je suis intéressé à éliminer est la facilité d'enregistrement ad-hoc - l'attribut, la méthode RegisterFactory et le moteur qui analyse le dossier et charge les assemblées pertinentes. Maintenant, je me rends compte que l'unité n'est peut-être pas suffisante. Je suis intéressé de connaître les solutions complémentaires qui satisferont nos besoins. Je souhaite juste utiliser quelque chose de bien connu et testé, de préférence quelque chose qui aspire à être standard.

Répondre

0

Unity nécessite une configuration de type, dans la configuration de l'application ou lors de l'exécution. Votre moteur actuel ajoute de la valeur en effectuant un sondage d'assemblage. L'unité ne le fait pas. Le seul but que je vois desservir Unity est de remplacer votre Manager et éventuellement vos classes Factory en permettant au Client de résoudre les Entités (et les Usines?) En utilisant Unity. Vous pouvez continuer à autoriser votre moteur à configurer à chaud Unity avec les assemblys qu'il trouve.

+0

Merci pour l'asnwer. J'ai édité ma question. – mark