2010-11-10 41 views

回答

2

就像你说的,你需要的是应以创建您的服务中使用的定制ServiceHostFactory。事情是这样的:

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

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

您还需要负责创建必要的服务的ServiceHost:

 
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(); 
    } 

} 

随着IServiceBehavior接口的自定义实现,这将是能够提供者InstanceProvider用于创建服务实例:

 
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) 
    { 
    } 

} 

最后的实例提供,将允许您使用的IoC注入任何你想要的要求Servi大街ce实例:

 
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) 
    { 

    } 
} 

希望它有帮助!

+0

是的。它有助于。谢谢 :) – ArielBH 2010-11-10 13:57:17