在WCF ServiceHost中提供工厂而不是Type

时间:2011-09-12 18:19:05

标签: c# wcf

有没有办法扩展ServiceHost以便接受工厂?

我想使用动态服务代理来进行WCF调用的一些预处理,而不需要触及服务实现。

修改

现在ServiceHost创建看起来像

var host = new ServiceHost(typeof(MyService));

我想使用像

这样的东西
var factory = new ServiceProxyFactory<MyService>();
var host = new MyServiceHost(typeof(MyService), factory);

2 个答案:

答案 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可以在IInstanceProviderService级别插入Endpoint ...

有关进一步参考,请参阅以下链接