2

Je cherche des informations sur l'utilisation et la configuration de windsor pour fournir un proxy dynamique permettant d'intercepter des appels vers une instance d'une autre classe.Utilisation de DynamicProxy comme motif décoratif dans un conteneur windsor

Ma classe représente une ressource qui devrait être conservée en tant qu'instance de longue durée par le conteneur pour des raisons de performances. Cependant, cette ressource peut parfois passer dans un état inutilisable et nécessite un renouvellement. Je voudrais que le conteneur gère cela, donc le code client ne doit pas. Je peux créer ma propre usine pour faire ceci, je voudrais savoir s'il y a une certaine fraîcheur d'enregistrement de Windsor pour le faire pour moi donc je ne dois pas créer la classe séparée d'usine :)

Voici un pseudo code pour démontrer le problème:

public interface IVeryImportantResource 
{ 
    void SomeOperation(); 
} 

public class RealResource : IVeryImportantResource 
{ 
    public bool Corrupt { get; set; } 

    public void SomeOperation() 
    { 
     //do some real implementation 
    } 
} 

public class RealResourceInterceptor : IInterceptor 
{ 
    private readonly IKernel kernel; 

    public RealResourceInterceptor(IKernel Kernel) 
    { 
     kernel = Kernel; 
    } 

    public void Intercept(IInvocation invocation) 
    { 
     RealResource resource = invocation.InvocationTarget as RealResource; 

     if(resource.Corrupt) 
     { 
      //tidy up this instance, as it is corrupt 
      kernel.ReleaseComponent(resource); 
      RealResource newResource = kernel.Resolve<RealResource>(); //get a new one 
      //now what i would like to happen is something like this 
      //but this property has no setter, so this doesn't work 
      //also, i would like to know how to register RealResourceInterceptor as well RealResourceInterceptor 
      invocation.InvocationTarget = newResource; 
     } 
     invocation.Proceed(); 
    } 
} 

Toute idée comment mettre en œuvre quelque chose comme ma classe RealResourceInterceptor, et aussi comment configurer le conteneur pour l'utiliser? Merci!

Répondre

2

Cette question est plus sur le renouvellement d'un composant singleton que l'interception. Le problème du renouvellement des singletons est répondu dans this question.

Bottom line: ce n'est pas aussi facile qu'il n'y paraît, il y a de nombreux pièges avec cette approche.

Peut-être que le problème se trouve dans ce composant se corrompu (pourquoi cela se produit?)

+1

Utilisation de l'installation du château est la voie à suivre –

0

Mon objet est un proxy WCF. Ces objets passeront à un état défectueux qui les rendra inutilisables. Je n'ai aucun contrôle sur le moment ou la transition. Je peux seulement détecter que cela s'est produit et recréer un nouveau proxy.

Merci pour le lien, la section citée ci-dessous décrit à peu près comment je suis actuellement le faire:

Sinon une autre approche est de avoir un décorateur pour votre service enregistré dans le récipient avec un mode de vie singleton , mais votre service sous-jacent réel enregistré dans le conteneur avec un mode de vie transitoire - puis quand vous avez besoin de rafraîchir le composant simplement recycler les pièces sous-jacente transitoire détenu par le décorateur et le remplacer par un exemple fraîchement résolu (résoudre en utilisant la clé de composants, plutôt que le service, pour éviter d'avoir le décorateur ) - ce qui évite les problèmes avec autres services singleton (qui ne sont pas être « rafraîchi ») de maintien sur services rassis qui ont été éliminés les rendant inutilisables, mais nécessite un peu de casting, etc. pour faire fonctionner

Ma question est, au lieu de l'une de ces :

1) en utilisant un décorateur typé statiquement, pour envelopper mon RealResource (comme ci-dessus). Une fois que vous obtenez un certain nombre de ces procurations, il devient difficile de créer des décorateurs pour tous. 2) utiliser un objet usine qui crée le proxy dynamique pour gérer l'état de tout proxy WCF.2) est de loin supérieur mais semble être quelque chose que Windsor pourrait déjà faire pour moi. Donc, je voudrais savoir s'il y a un automagic de conteneur, ce qui me permettra d'enregistrer un intercepteur au moment de la configuration au lieu de créer ma propre usine?

Quelque chose comme ce pseudo-code:

container.AddComponent("dynamicProxyWrapper", typeof(IRealResource), typeof(RealResource)).UsingInterceptor(typeof(RealResourceInterceptor)); 
+0

Avez-vous essayé le MFA? http://www.castleproject.org/container/facilities/trunk/wcf/index.html –

Questions connexes