2010-08-23 5 views
0

J'ai la classe suivante: public class MainView : IHandle<MessageOne>,
IHandle<MessageTwo>...
Château Windsor Fluent Enregistrement Problème

Je voudrais enregistrer tous les cours de mise en œuvre au moins une version fermée du ihandle <> Interface avec l'enregistrement fluent du château de Windsor, mais il ne fonctionne pas travail. BasedOn (typeof (IHandleThe <>)) ne sélectionne pas les bons types. J'utilise la déclaration suivante:

container.Register(AllTypes 
        .FromAssemblyNamed("MyAssembly") 
        //.If(t => t.Name.EndsWith("View") 
        .BasedOn(typeof(IHandleThe<>)) 
        .Configure(registration => DoStuff()) 
        .WithService.Base); 

Le code ci-dessus ne soit pas dans l'appel Configurer mais quand je commente la ligne BasedOn et décommenter la ligne Si, il fonctionne. Le If n'est pas trop utile, cependant. Est-ce que quelqu'un a une idée de ce que je fais de mal?

Toutes les idées/aide est appréciée

Meilleures salutations Gope

Répondre

0

C'est l'une des choses moins intuitives sur l'API. Si vous jetez un oeil at the documentation, vous constaterez que PickBasedOn et Where faire XOR, de sorte que le code enregistrerait ci-dessus deux ensembles de types:

  1. Les types qui ont le nom se terminant par « View » (avec défaut connfiguration Les types qui sont basés sur IHandleThe<> (tous trouvés dans l'assembly, la condition précédente ne s'applique pas ici) et les configurer au service de base, et tout ce que fait la méthode DoStuff.

Pour obtenir ce que vous voulez (en fonction du type et si le nom se termine par Si) l'appel BasedOn doit aller d'abord, tous les autres doivent aller après.

+0

Bonjour Krzysztof et merci pour votre aide, le point est: juste BasedOn() ne fonctionne pas. Le If-Line est seulement pour Stackoverflow pour montrer aux gens que la version BasedOn ne fonctionne pas mais en utilisant le si sans BasedOn. Juste pour prouver que ce n'est pas une erreur trop stupide comme l'assemblée n'est pas là. Je ne veux que des types implémentant IHandleThe <>. Rien avec un nom comme "Voir". Mais je comprends que vous vous attendez à ce que le code ci-dessus fonctionne comme il est (avec le si-ligne commenté ou supprimé). Une autre idée de ce qui pourrait être la cause? – Gope

+0

ok, quelle version utilisez-vous? Êtes-vous sûr qu'il existe des types implémentant 'IHandlerThe <>' dans cet assemblage? J'ai écrit du code comme ça sur un certain nombre de projets - il faut ** travailler –

+0

Yup, IHandleThe <> est implémenté par une classe (MainView) et la partie configure repose sur ce type qui fonctionne avec la ligne if . Donc, cela ne peut pas être le problème, mais maybee la version? Le Castle.Windsor.dll est de la version 2.1.0.6655. Je l'ai copié à partir d'une démo Rhino-ESB d'amis. Peut-il y avoir des problèmes avec des trucs 64/32 bits dans les assemblages Castle? Je viens de trouver que 2 de mes 4 projets ont un type de build de x86 alors que les autres (sans assemblages externes référencés) sont sur anyCPU ... étrange ... au fait, tout est sur .NET 4.0 – Gope

Questions connexes