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:
- types d'entité (
A
,B
) - usines entité (
FactoryA
,FactoryB
) - Gestionnaire d'entités (
Manager
) - 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:
- examiner et y trouver l'instance attribuer le niveau d'assemblage pertinent
- Créer une nouvelle instance à l'aide
FactoryC
réflexion - Appelez
Manager.RegisterFactory
, en passant l'instanceFactoryC
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.
Merci pour l'asnwer. J'ai édité ma question. – mark