我需要将存在 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.
请帮忙
感谢。
答案 0 :(得分: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&amp; ServiceHost的。 现在我可以将参数传递给我的构造函数。
由于