2010-06-17 13 views
1

J'utilise Ninject comme conteneur DI dans une application Silverlight. Maintenant, j'étends l'application pour supporter l'interception et j'ai commencé à intégrer l'extension DynamicProxy2 pour Ninject. J'essaye d'intercepter l'appel aux propriétés sur un ViewModel et finissant par obtenir l'exception suivante:Problème lors de l'interception de la propriété dans l'application Silverlight

"La tentative d'accès à la méthode a échoué: System.Reflection.Emit.DynamicMethod..ctor (System.String, System.Type, System .Type [], System.Reflection.Module, Boolean) "

Cette exception est levée lorsque la méthode invocation.Proceed() est appelée. J'ai essayé deux implémentations de l'intercepteur et ils ont tous deux manquai

public class NotifyPropertyChangedInterceptor: SimpleInterceptor 
{ 
    protected override void AfterInvoke(IInvocation invocation) 
    { 
     var model = (IAutoNotifyPropertyChanged)invocation.Request.Proxy; 
     model.OnPropertyChanged(invocation.Request.Method.Name.Substring("set_".Length)); 
    } 
} 

public class NotifyPropertyChangedInterceptor: IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed(); 
     var model = (IAutoNotifyPropertyChanged)invocation.Request.Proxy; 
     model.OnPropertyChanged(invocation.Request.Method.Name.Substring("set_".Length)); 
    } 
} 

Je veux appeler OnPropertyChanged méthode sur le ViewModel lorsque la valeur de la propriété est définie. J'utilise l'interception basée sur les attributs. J'ai testé l'implémentation avec une application console et ça marche.

J'ai également noté dans l'application console tant que j'avais Ninject.Extensions.Interception.DynamicProxy2.dll dans le même dossier que Ninject.dll je n'ai pas eu à charger explicitement DynamicProxy2Module dans le noyau, où j'ai dû charger explicitement pour l'application Silverlight comme suit:

IKernel kernel = new StandardKernel(new DIModules(), new DynamicProxy2Module()); 

Pourriez-vous nous aider s'il vous plaît? Merci

Répondre

0

La réflexion peut être très délicate dans Silverlight en raison de problèmes de sécurité.

Vérifiez la réponse de Gabe pour this question, c'est le même problème. Les bonnes nouvelles sont que vous pouvez obtenir la même fonctionnalité que vous voulez en utilisant dynamique au lieu de proxies. Étendez simplement votre ViewModel à partir de DynamicObject et remplacez la méthode TrySetMember.

J'espère que cela aide :)