2012-09-05 156 views
1

我需要传递一个存在 DI容器作为参数传递给WCF服务构造 为了做到这一点我使用IInstanceProvider WCF服务应在自主机托管。参数传递给WCF服务构造

public class CustomInstanceProvider : IInstanceProvider, IContractBehavior 
{ 
    private readonly IUnityContainer UnityContainer; 

    public CustomInstanceProvider(IUnityContainer unityContainer) 
    { 
     if (unityContainer == null) 
     { 
      throw new ArgumentNullException("unityContainer"); 
     } 

     UnityContainer = unityContainer; 
    } 


    #region Implementation of IInstanceProvider 

    public object GetInstance(InstanceContext instanceContext) 
    { 
     return new Service(UnityContainer); 
    } 

    public object GetInstance(InstanceContext instanceContext, Message message) 
    { 
     return this.GetInstance(instanceContext); 
    } 
    public void ReleaseInstance(InstanceContext instanceContext, object instance) 
    { 

    } 

    #endregion 

    #region Implementation of IContractBehavior 

    public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) 
    { 

    } 

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) 
    { 
     dispatchRuntime.InstanceProvider = this; 

    } 

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 

    } 


    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 

    } 

    #endregion 
} 

我也实现了CustomServiceHost

public class CustomServiceHost : ServiceHost 
    { 
     public CustomServiceHost(IUnityContainer unityContainer, Type serviceType, params Uri[] baseAddresses) 
     : base(serviceType, baseAddresses) 
    { 
     if (unityContainer == null) 
     { 
      throw new ArgumentNullException("unityContainer is null"); 
     } 

     foreach (var cd in this.ImplementedContracts.Values) 
     { 
      cd.Behaviors.Add(new CustomInstanceProvider(unityContainer)); 
     } 

    } 
} 

和ServiceHostFactory

public class CustomServiceHostFactory : ServiceHostFactory 
{ 
    private readonly IUnityContainer UnityContainer; 
    public CustomServiceHostFactory(IUnityContainer unityContainer) 
    { 
     UnityContainer = unityContainer; 
    } 

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

}

我创建WCF服务:

  var uris = new Uri[1]; 
     uris[0] = new Uri("http://localhost:8793/Service/"); 
     CustomServiceHostFactory factory = new CustomServiceHostFactory(Container); 
     CustomServiceHost serviceHost = (CustomServiceHost)factory.CreateServiceHost("guy",uris); 
     ServiceEndpoint endpoint = serviceHost.AddServiceEndpoint(typeof(IService), new WSHttpBinding(), ""); 
     serviceHost.Open(); 

我得到一个异常:

An exception occurred while initializing module 'PluginsModule'. 

- The exception message was: 'ServiceHostFactory.CreateServiceHost' cannot be invoked within the current hosting environment. This API requires that the calling application be hosted in IIS or WAS. 

- The Assembly that the module was trying to be loaded from was:<"PluginsModule.plugin" , Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

Check the InnerException property of the exception for more information. If the exception occurred while creating an object in a DI container, you can exception.GetRootException() to help locate the root cause of the problem. 

请帮

感谢。

+0

难道你不想调用CreateServiceHost类型作为第一个参数而不是字符串吗?这是你重写的方法 – Yoztastic

+0

它是受保护的方法 – Guy

+0

是否返回新的CustomServiceHost(UnityContainer,serviceType,baseAddresses);'调用时调用'(CustomServiceHost)factory.CreateServiceHost(“guy”,uris);'? – Yoztastic

回答

6

好的, 问题是我不需要使用CustomInstanceProvider。 ServiecInstanceProvider仅供IIS使用。 我希望我的服务能够在自主服务器中托管。

 var uris = new Uri[1]; 
     uris[0] = new Uri("http://localhost:8793//Service/ntService/"); 
     var serviceHost = new CustomServiceHost(Container,typeof(Service),uris); 
     serviceHost.AddDefaultEndpoints(); 

这就是所有我需要到: 实现IInstanceProvider & ServiceHost的。 现在我可以传递参数给我的构造函数。

谢谢