1

我需要将现有的 DI 容器作为参数传递给 WCF 服务构造函数为了做到这一点,我正在使用 IInstanceProvider 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.

请帮忙

谢谢。

4

1 回答 1

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。现在我可以将参数传递给我的构造函数。

谢谢

于 2012-09-05T11:33:16.780 回答