2010-11-10 13 views

Répondre

2

Comme vous avez dit que vous aurez besoin d'un ServiceHostFactory personnalisé qui doit être utilisé afin de créer vos services. Quelque chose comme ceci:

 
public class SessionPerCallServiceHostFactory : ServiceHostFactory 
{ 
    public SessionPerCallServiceHostFactory() 
    { 
    } 

    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     return new SessionPerCallServiceHost(serviceType, baseAddresses); 
    } 
} 

Vous aurez également besoin d'un ServiceHost responsable de la création du service nécessaire:

 
public class SessionPerCallServiceHost : ServiceHost 
{ 
    public SessionPerCallServiceHost() 
    { 
    } 

    public SessionPerCallServiceHost(Type serviceType, params Uri[] baseAddresses) 
    : base(serviceType, baseAddresses) 
    { 
    } 

    protected override void OnOpening() 
    { 
     Description.Behaviors.Add(new SessionPerCallServiceBehavior()); 
     base.OnOpening(); 
    } 

} 

Avec une implémentation personnalisée de IServiceBehavior qui sera en mesure de fournisseur le InstanceProvider utilisé pour créer le service cas:

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

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

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
    } 

} 

Et enfin, le fournisseur d'instance qui vous permettra d'utiliser le IoC pour injecter tout ce que vous voulez dans la demande Servi exemple:

 
public class SessionPerCallInstanceProvider : IInstanceProvider 
{ 
    private readonly Type _serviceType; 

    public SessionPerCallInstanceProvider(Type serviceType) 
    { 
     _serviceType = serviceType; 
    } 

    public object GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message message) 
    { 
     //I'm creating it without any tricks but you could use your IoC container here 
     return Activator.CreateInstance(_serviceType); 
    } 

    public object GetInstance(InstanceContext instanceContext) 
    { 
     return GetInstance(instanceContext, null); 
    } 

    public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, object instance) 
    { 

    } 
} 

Espérons que ça aide!

+0

Oui. Ça aide. Merci :) – ArielBH