2010-03-15 19 views
3

J'essaie d'intégrer une application basée sur netTcpBinding qui est hébergée dans WAS avec un conteneur IoC (autofac/spring). Malheureusement, lorsqu'il démarre dans WAS et qu'il ne s'agit pas d'une application HTTP, aucun événement n'est déclenché dans la classe d'application globale.WAS Activation non-HTTP - démarrage de l'application hookée

J'ai besoin d'attraper le démarrage du domaine d'application pour pouvoir configurer le conteneur IoC. Y at-il un moyen de le faire lors de l'hébergement dans WAS?

J'ai vu des choses horribles impliquant l'utilisation de classes statiques dans les dossiers App_Code, mais j'aimerais quelque chose de plus testable et pas aussi sale.

Répondre

0

Vous pouvez implémenter IInstanceProvider (voir http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iinstanceprovider.aspx) et indiquer à l'environnement d'exécution WCF de l'utiliser via un comportement de service.

Le comportement du service peut être configuré avec un hôte personnalisé, une configuration ou un attribut. Voici un exemple de ce dernier:

public class DependencyInjectionServiceBehaviorAttribute : Attribute, IServiceBehavior 
{ 
    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     foreach (var cdb in serviceHostBase.ChannelDispatchers) 
     { 
      var cd = cdb as ChannelDispatcher; 
      if (cd != null) 
      { 
       foreach (EndpointDispatcher ed in cd.Endpoints) 
       { 
        ed.DispatchRuntime.InstanceProvider = new MyServiceFactory(serviceDescription.ServiceType); 
       } 
      } 
     } 
    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, 
      Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) {} 
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {} 
}