gpt4 book ai didi

c# - 在 WCF 中运行时切换服务协定实现

转载 作者:太空狗 更新时间:2023-10-30 01:24:17 24 4
gpt4 key购买 nike

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

假设我有:

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

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

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

我希望能够在配置文件或数据库中的值之间切换正在使用的实现。是否也可以在 WCF 服务热的时候执行此操作?

最佳答案

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

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)
{
}
}

让您的实例提供者类实现 IInstanceProvider 并在 GetInstance 方法中返回相关实例。

public XInstanceProvider :IInstanceProvider
{
...

public object GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message message)
{
return new ServiceX();
}
}

那么你只需要在服务中添加servicebehaviour即可;像

[XInstanceProviderServiceBehavior()]    
public class MyService : IMyService

关于c# - 在 WCF 中运行时切换服务协定实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9902692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com