gpt4 book ai didi

wcf - 如何将值传递给 wcf 服务上的构造函数?

转载 作者:行者123 更新时间:2023-12-03 04:48:40 28 4
gpt4 key购买 nike

我想将值传递到实现我的服务的类的构造函数中。

但是,ServiceHost 只允许我传递要创建的类型的名称,而不允许传递给其构造函数的参数。

我希望能够传入一个创建我的服务对象的工厂。

到目前为止我发现了什么:

最佳答案

您需要实现自定义 ServiceHostFactoryServiceHostIInstanceProvider 的组合。

给定具有此构造函数签名的服务:

public MyService(IDependency dep)

这是一个可以启动 MyService 的示例:

public class MyServiceHostFactory : ServiceHostFactory
{
private readonly IDependency dep;

public MyServiceHostFactory()
{
this.dep = new MyClass();
}

protected override ServiceHost CreateServiceHost(Type serviceType,
Uri[] baseAddresses)
{
return new MyServiceHost(this.dep, serviceType, baseAddresses);
}
}

public class MyServiceHost : ServiceHost
{
public MyServiceHost(IDependency dep, Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
if (dep == null)
{
throw new ArgumentNullException("dep");
}

foreach (var cd in this.ImplementedContracts.Values)
{
cd.Behaviors.Add(new MyInstanceProvider(dep));
}
}
}

public class MyInstanceProvider : IInstanceProvider, IContractBehavior
{
private readonly IDependency dep;

public MyInstanceProvider(IDependency dep)
{
if (dep == null)
{
throw new ArgumentNullException("dep");
}

this.dep = dep;
}

#region IInstanceProvider Members

public object GetInstance(InstanceContext instanceContext, Message message)
{
return this.GetInstance(instanceContext);
}

public object GetInstance(InstanceContext instanceContext)
{
return new MyService(this.dep);
}

public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
var disposable = instance as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}

#endregion

#region IContractBehavior Members

public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}

public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}

public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.InstanceProvider = this;
}

public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
}

#endregion
}

在 MyService.svc 文件中注册 MyServiceHostFactory,或直接在代码中使用 MyServiceHost 以实现自托管方案。

您可以轻松地推广此方法,事实上,一些 DI 容器已经为您完成了此操作(提示:Windsor 的 WCF 工具)。

关于wcf - 如何将值传递给 wcf 服务上的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454850/

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