有没有办法扩展ServiceHost
以便接受工厂?
我想使用动态服务代理来进行WCF调用的一些预处理,而不需要触及服务实现。
修改
现在ServiceHost
创建看起来像
var host = new ServiceHost(typeof(MyService));
我想使用像
这样的东西var factory = new ServiceProxyFactory<MyService>();
var host = new MyServiceHost(typeof(MyService), factory);
答案 0 :(得分:3)
我正在寻找的界面是IInstanceProvider.
public class MyServiceInstanceProvider<TService> : IInstanceProvider where TService : new()
{
public object GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message message)
{
return ServiceFactory.Create<TService>();
}
public object GetInstance(InstanceContext instanceContext)
{
return ServiceFactory.Create<TService>();
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
return;
}
}
public class MyEndpointBehavior<TService> : IEndpointBehavior where TService : new()
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
return;
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
return;
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
endpointDispatcher.DispatchRuntime.InstanceProvider = new MyServiceInstanceProvider<TService>();
}
public void Validate(ServiceEndpoint endpoint)
{
return;
}
}
public class MyServiceHost<TService> : ServiceHost where TService : new()
{
public MyServiceHost(params Uri[] baseAddresses)
:base(typeof(TService), baseAddresses)
{
}
public override System.Collections.ObjectModel.ReadOnlyCollection<ServiceEndpoint> AddDefaultEndpoints()
{
var endpoints = base.AddDefaultEndpoints();
foreach (var endpoint in endpoints)
{
endpoint.Behaviors.Add(new MyEndpointBehavior<TService>());
}
return endpoints;
}
public override void AddServiceEndpoint(ServiceEndpoint endpoint)
{
base.AddServiceEndpoint(endpoint);
endpoint.Behaviors.Add(new MyEndpointBehavior<TService>());
}
}
答案 1 :(得分:2)
您所描述的内容对于.NET来说是不可能的......
您可以实现custom ServiceHost,它允许您自定义ServiceHost和/或IDispatchMessageInspector的行为,允许您检查/修改入站和出站的任何邮件...如果您真的想要实现某种“动态路由”,然后始终有Routing capability of WCF ...
其他选项(虽然没有100%解决方案):
编辑 - 我的立场得到了纠正:
实际上不可能使用通常的工厂但是WCF可以在IInstanceProvider
或Service
级别插入Endpoint
...
有关进一步参考,请参阅以下链接