如何將值傳遞給WCF服務的構造函數?我希望將值傳遞給實現我的服務的類的構造函數。但是Servicehost只允許我傳遞要創建的類型的名稱,而不是傳遞給其構造函數的參數。我希望能夠傳遞一個創建我的服務對象的工廠。到目前為止,我發現的是:WCF依賴注入行為這比我想要的更多,而且似乎對我的需求過于復雜。
3 回答
萬千封印
TA貢獻1891條經驗 獲得超3個贊
ServiceHostFactory, ServiceHostIInstanceProvider.
public MyService(IDependency dep)
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}
白衣染霜花
TA貢獻1796條經驗 獲得超10個贊
MyInstanceProviderBehaviorAttributeAttributeIServiceBehaviorIServiceBehavior.ApplyDispatchBehavior
// YourInstanceProvider implements IInstanceProvidervar instanceProvider = new YourInstanceProvider(<yourargs>);
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers){
foreach (var epDispatcher in dispatcher.Endpoints)
{
// this registers your custom IInstanceProvider
epDispatcher.DispatchRuntime.InstanceProvider = instanceProvider;
}}[ServiceBehavior][MyInstanceProviderBehavior(<params as you want>)]public class MyService : IMyContract
添加回答
舉報
0/150
提交
取消
