Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF中运行时的交换机服务契约实现_C#_.net_Wcf - Fatal编程技术网

C# WCF中运行时的交换机服务契约实现

C# WCF中运行时的交换机服务契约实现,c#,.net,wcf,C#,.net,Wcf,如何在运行时切换服务契约的实现 假设我有: [ServiceContract] public interface IService { [OperationContract] DoWork(); } public class ServiceA : IService { public string DoWork() { // .... } } public class ServiceB : IService { public string

如何在运行时切换服务契约的实现

假设我有:

[ServiceContract]
public interface IService {
    [OperationContract]
    DoWork();
}

public class ServiceA : IService {
    public string DoWork() {
        // ....
    }
}

public class ServiceB : IService {
    public string DoWork() {
        // ....
    }
}

我希望能够将正在使用的实现从配置文件或数据库中的值切换到这两者之间。在WCF服务处于热状态时也可以这样做吗?

您需要通过实现IServiceBehavior来编写servicebehavior,并使用实例提供程序初始化服务实例。下面初始化一个新的服务实例,您可以实现不同的逻辑:

public class XInstanceProviderServiceBehavior : Attribute, IServiceBehavior
{        

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (var item in serviceHostBase.ChannelDispatchers)
        {
            var dispatcher = item as ChannelDispatcher;
            if (dispatcher != null) 
            {
                dispatcher.Endpoints.ToList().ForEach(endpoint =>
                {
                    endpoint.DispatchRuntime.InstanceProvider = new XInstanceProvider(serviceDescription.ServiceType);
                });
            }
        }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }
}
然后,您只需将ServiceBehavior添加到服务中;差不多

[XInstanceProviderServiceBehavior()]    
    public class MyService : IMyService
[XInstanceProviderServiceBehavior()]    
    public class MyService : IMyService