如何将值传递给WCF服务的构造函数?

如何将值传递给WCF服务的构造函数?

我希望将值传递给实现我的服务的类的构造函数。

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

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

到目前为止,我发现的是:


红颜莎娜
浏览 690回答 3
3回答

万千封印

您需要实现自定义的组合ServiceHostFactory, ServiceHost和IInstanceProvider.给定具有此构造函数签名的服务: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设施)。

白衣染霜花

与使用自定义ServiceHostFactory不同,您还可以使用自定义属性(例如MyInstanceProviderBehaviorAttribute)。从Attribute,使其实现IServiceBehavior并实现IServiceBehavior.ApplyDispatchBehavior方法类//&nbsp;YourInstanceProvider&nbsp;implements&nbsp;IInstanceProvidervar&nbsp;instanceProvider&nbsp;=&nbsp;new&nbsp;YourInstanceProvider(<yourargs>); foreach&nbsp;(ChannelDispatcher&nbsp;dispatcher&nbsp;in&nbsp;serviceHostBase.ChannelDispatchers){ &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;epDispatcher&nbsp;in&nbsp;dispatcher.Endpoints) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;this&nbsp;registers&nbsp;your&nbsp;custom&nbsp;IInstanceProvider &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epDispatcher.DispatchRuntime.InstanceProvider&nbsp;=&nbsp;instanceProvider; &nbsp;&nbsp;&nbsp;&nbsp;}}然后,将该属性应用于服务实现类。[ServiceBehavior][MyInstanceProviderBehavior(<params&nbsp;as&nbsp;you&nbsp;want>)]public&nbsp;class&nbsp;MyService&nbsp;:&nbsp;IMyContract第三种选择:还可以使用配置文件应用服务行为。
打开App,查看更多内容
随时随地看视频慕课网APP