3 回答

TA貢獻1982條經驗 獲得超2個贊
WCF支持構造函數注入,但是您必須跳過幾個步驟才能到達那里。關鍵在于編寫自定義ServiceHostFactory。盡管它也必須具有默認構造函數,但是您可以使用它構造所有正確的行為。
作為示例,我最近寫了一篇使用Castle Windsor來為服務實現連接依賴關系的示例。CreateServiceHost的實現只是這樣做:
return new WindsorServiceHost(this.container, serviceType, baseAddresses);
this.container配置的IWindsorContainer 在哪里。
WindsorServiceHost看起來像這樣:
public class WindsorServiceHost : ServiceHost
{
public WindsorServiceHost(IWindsorContainer container, Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
foreach (var cd in this.ImplementedContracts.Values)
{
cd.Behaviors.Add(new WindsorInstanceProvider(container));
}
}
}
和WindsorInstanceProvider看起來像這樣:
public class WindsorInstanceProvider : IInstanceProvider, IContractBehavior
{
private readonly IWindsorContainer container;
public WindsorInstanceProvider(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
#region IInstanceProvider Members
public object GetInstance(InstanceContext instanceContext, Message message)
{
return this.GetInstance(instanceContext);
}
public object GetInstance(InstanceContext instanceContext)
{
var serviceType = instanceContext.Host.Description.ServiceType;
return this.container.Resolve(serviceType);
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
this.container.Release(instance);
}
#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
}
這看起來可能很多,但是請注意,它是可重用的通用代碼,其循環復雜度較低。
您可以遵循相同的編碼習慣,使用另一個DI容器或使用窮人的DI來實現依賴注入。
- 3 回答
- 0 關注
- 662 瀏覽
添加回答
舉報