3 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
WCF支持構(gòu)造函數(shù)注入,但是您必須跳過(guò)幾個(gè)步驟才能到達(dá)那里。關(guān)鍵在于編寫(xiě)自定義ServiceHostFactory。盡管它也必須具有默認(rèn)構(gòu)造函數(shù),但是您可以使用它構(gòu)造所有正確的行為。
作為示例,我最近寫(xiě)了一篇使用Castle Windsor來(lái)為服務(wù)實(shí)現(xiàn)連接依賴關(guān)系的示例。CreateServiceHost的實(shí)現(xiàn)只是這樣做:
return new WindsorServiceHost(this.container, serviceType, baseAddresses);
this.container配置的IWindsorContainer 在哪里。
WindsorServiceHost看起來(lái)像這樣:
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看起來(lái)像這樣:
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
}
這看起來(lái)可能很多,但是請(qǐng)注意,它是可重用的通用代碼,其循環(huán)復(fù)雜度較低。
您可以遵循相同的編碼習(xí)慣,使用另一個(gè)DI容器或使用窮人的DI來(lái)實(shí)現(xiàn)依賴注入。

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您使用的是Castle Windsor,它具有出色的WCF集成功能,可以讓您輕松地做到這一點(diǎn)。

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
您是否將服務(wù)配置為Singleton?我發(fā)現(xiàn)使用DI容器創(chuàng)建服務(wù)實(shí)例時(shí),IInstanceProvider實(shí)現(xiàn)可能會(huì)出現(xiàn)問(wèn)題。
- 3 回答
- 0 關(guān)注
- 657 瀏覽
添加回答
舉報(bào)