亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將數據注入WCF服務

將數據注入WCF服務

富國滬深 2019-12-27 10:22:32
我有如Miguel Castro建議的那樣構造的WCF服務。這意味著我已經手動設置了所有內容,并擁有一個使用ServiceHost對象托管我的服務的控制臺應用程序。我想讓我的服務類保持精簡,并且它們當前只是傳遞對行為類的調用。我現在的問題是對服務類進行單元測試。我想向類中注入一些東西作為構造函數參數,這樣我就可以模擬掉它并編寫適當的隔離單元測試。ServiceHost類似乎不接受參數,所以我的問題是如何將數據注入服務類中?
查看完整描述

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來實現依賴注入。


查看完整回答
反對 回復 2019-12-27
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

如果您使用的是Castle Windsor,它具有出色的WCF集成功能,可以讓您輕松地做到這一點。


查看完整回答
反對 回復 2019-12-27
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

您是否將服務配置為Singleton?我發現使用DI容器創建服務實例時,IInstanceProvider實現可能會出現問題。


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 662 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號