2010-05-01 20 views
5

Lets considérer certains cas:Dans Castle Windsor, puis-je enregistrer un composant Interface et obtenir un proxy de la mise en œuvre?

_windsor.Register(Component.For<IProductServices>().ImplementedBy<ProductServices>().Interceptors(typeof(SomeInterceptorType)); 

Dans ce cas, quand je demande un windsor IProductServices sera l'interface proxy pour intercepter les appels de méthode d'interface. Si au contraire je fais ceci:

_windsor.Register(Component.For<ProductServices>().Interceptors(typeof(SomeInterceptorType)); 

alors je ne peux pas demander de windsor résoudre IProductServices, au lieu que je demande ProductServices et il retournera une sous-classe dynamique qui intercepte les appels de méthode virtuelle. Bien sûr, la sous-classe dynamique implémente toujours 'IProductServices'

Ma question est: Puis-je enregistrer le composant Interface comme dans le premier cas, et obtenir le proxy de la sous-classe comme dans le second cas?

Il ya deux raisons pour lesquelles je veux cela:
1 - Parce que le code qui va résoudre ne peut pas connaître la classe ProductServices, seulement sur l'interface IProductServices. 2 - Certaines invocations d'événement qui transmettent l'expéditeur en tant que paramètre transmettent l'objet ProductServices et, dans le premier cas, cet objet est un champ sur le proxy dynamique, et non l'objet réel retourné par windsor. Permettez-moi de donner un exemple de la façon dont cela peut compliquer les choses: Disons que j'ai une collection personnalisée qui fait quelque chose lorsque leurs articles avisent un changement de propriété:

private void ItemChanged(object sender, PropertyChangedEventArgs e) 
    { 
     int senderIndex = IndexOf(sender); 
     SomeActionOnItemIndex(senderIndex); 
    } 

Ce code échouera si j'ai ajouté un proxy d'interface, parce que la expéditeur sera le champ dans le proxy d'interface et l'IndexOf (expéditeur) renverra -1.

Répondre

5

Oui, vous pouvez:

_windsor.Register(Component.For<ProductServices, IProductServices>() 
    .Interceptors(typeof(SomeInterceptorType)); 
+1

A travaillé très bien, merci. –