2013-08-12 1 views
4

Nous passons de UNITY à Ninject comme localisateur de service par défaut pour les services WCF. Il y a un superbe paquet NuGet disponible pour cela et obtenir une résolution standard est un jeu d'enfant.L'interception de Ninject ne peut pas fonctionner avec WCF

Cependant, je souhaite intercepter les appels vers mon service WCF. Voici ce que j'ai:

Mon fichier svc:

<%@ ServiceHost Language="C#" Debug="true" Service="NinjectWcfApp.Service1" Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %> 

Voici mon service:

public class Service1 : IService1 
{ 


    [Inject] 
    public ISomeManager Manager { get; set; } 


public string GetData(int value) 
{ 
    if(this.Manager != null) 
     this.Manager.DoStuff(); 


    return string.Format("You entered: {0}", value); 
} 

} 

noyau est construit comme ceci:

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ISomeManager>().To<SomeManager>(); 
    kernel.Bind<IService1>().To<Service1>().Intercept().With<MyInterceptor>(); 
} 

Si la configuration I le noyau comme ceci, l'instance du gestionnaire est injectée, mais il n'y a pas d'interception. Mon intercepteur qui enregistre quelque chose avant l'exécution et après l'exécution n'est jamais invoqué.

Autres discussions Stackoverflow suggèrent d'utiliser:

kernel.Bind<Service1>().ToSelf().Intercept().With<MyInterceptor>(); 

Si je fais cela, le gestionnaire n'est pas injecté. Si je poursuis et crée un constructeur qui prend en charge le manager, ça marche, mais encore une fois: pas d'interception.

kernel.Bind<Service1>().ToSelf().WithConstructorArgument("manager", kernel.Get<ISomeManager>()).Intercept().With<MyInterceptor>(); 

Qu'est-ce que je fais mal ici?

+0

Wow .... pas un? –

Répondre

0

Toutes les méthodes qui sont interceptées doivent être virtuelles:

public virtual string GetData(int value) 
Questions connexes