2010-05-28 8 views
0

Je construis un ensemble de bibliothèques de classes qui produisent des rapports basés sur le format XML ouvert et j'utilise un conteneur IoC statique de Windsor. Mon problème est qu'un point d'entrée possible au système de reporting est via une interface Web, ce qui signifie que le conteneur IoC statique des systèmes de reporting est partagé entre plusieurs requêtes Web, ce qui entraîne des exceptions car pour chaque nouvelle requête, le système de reporting essayer de réenregistrer des composants à Windsor qui étaient déjà enregistrés par une demande antérieure.Comment puis-je avoir un conteneur Windsor IoC qui peut être partagé entre mes classes mais pas partagé entre plusieurs requêtes Web?

Je ne souhaite pas déplacer l'enregistrement dans l'application web global.asax car mon système de reporting ne sera plus autonome.

Comment puis-je avoir un conteneur Windsor IoC qui peut être partagé entre mes classes de génération de rapports mais pas partagé entre plusieurs requêtes Web?

+0

N'utilisez pas de localisateur de service statique. C'est un anti-pattern et vous rencontrez maintenant l'un des problèmes inhérents. Cela devrait vous amener à reconsidérer sérieusement votre conception - peut-être dans cette direction: http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 –

Répondre

2

Ne pas recréer le récipient encore et encore. Ne créez et configurez-le une fois par votre application au point de départ global. Vous pouvez toujours rendre vos composants autonomes en encapsulant tous les enregistrements dans installers. Ensuite, dans global.asax, vous n'installerez que les installateurs, ce qui est assez facile à faire et dans Windsor 2.5, c'est littéralement 2 lignes de code.

+0

+1 pour cette option. Je ne le connaissais pas. – Ikaso

+0

Merci, l'idée de l'installeur fonctionne bien mais j'ai encore dû rendre le conteneur passé à la classe d'installateur accessible en utilisant des données statiques. –

+0

@Si - vous ne devrez pas dans Windsor 2.5 - vous serez capable d'écrire simplement: 'container.Install (FromAssembly.Named (" YourAssembly "))' –

1

Avez-vous essayé l'option Lifestyle pour vos composants? Il existe un PerWebRequestLifestyleManager et une option PerWebRequestLifestyleModule. Voir here la documentation pour les modes de vie. Et voir here un exemple qui utilise les options de style de vie.

+0

mmm ne signifie pas que le rapport l'application 'sait' qu'elle est appelée depuis une application web? Ou peut-être que cela n'a pas d'importance comme si ce n'était pas ce serait toujours heureux. –

+0

C'est quelque chose que vous mettez dans la configuration du château. Votre application de reporting peut venir avec la configuration que vous voulez. Lorsque le rapport s'exécute dans l'application Web, la configuration change pour utiliser les options perwebrequest. Notez que vous pouvez également configurer le conteneur par programmation. Ainsi, si le module de reporting configure le conteneur par programme, vous devrez procéder à un refactoring pour que le module de reporting soit indifférent à la configuration du conteneur. – Ikaso