2010-11-22 103 views
2

我有一個使用另一個服務(Service2)的服務(Service1)。我正在爲這兩種服務使用依賴注入,並且需要將Service2的代理注入到Service1中。使用WCF代理的依賴注入

我不確定如何處理代理不是簡單的IService2類,而是從ClientBase繼承的代理。很明顯,我的Service1實現需要打開代理,並且應該在使用後關閉它,或者如果發生異常而中止它,但是如果我只是注入一個IService2實例,那麼我不能這樣做(因爲打開,關閉和中止方法)是在基類上,而我的操作是在界面上。

當談到測試Service1時,我希望只是模擬接口,但如果Service1實現期望Open,Close和Abort方法,那麼這很棘手。在過去,我做了一件這樣的事,但必須有更好的方法!

var proxyBase = _service2 as ClientBase; 

if (proxyBase != null) 
{ 
    proxyBase.Open(); 
} 

_service2.DoOperation("blah"); //the actual operation 

if (proxyBase != null) 
{ 
    proxyBase.Close(); 
} 

// repeat for Abort in exception handler(s). 

其他人在做什麼?

感謝

回答

0

我結束了使用this approach它使用城堡動態代理攔截調用和處理WCF細節。它運行得非常好,並允許代理注入的類將其視爲正常的類/接口。然後通過嘲笑服務合約界面來完成這個類的單元測試。

+0

@ the-folower-guy請更新評論中的鏈接。謝謝 – 2013-10-19 18:37:26

3

自動生成的,你得到了增加對WCF服務的服務參考實現爲部分類類。我要做的就是創建該類的另一部分文件和實施暴露這些方法的接口,然後使用該接口,你通常會使用ClientBase或WCF接口

public partial class Service2 : IClientService2 
{} 

如果IClientService2有中止和關閉匹配ClientBase方法的方法應該是您所需要的。

public interface IClientService2 : IService2 // where IService2 is the WCF service interface 
{ 
    void Abort(); 
    void Close(); 
} 

我建議注射工廠構建WCF服務,而不是注入代理本身發生故障時,則通道不再能夠使用,你將需要建立一個新的代理至今。

IClientService2 proxy = _service2Factory.Create(); 


proxy.Open(); 


proxy.DoOperation("blah"); //the actual operation 


proxy.Close(); 
+0

我使用相同的解決方案,不同之處在於我的IClientService2接口從ICommunicationObject繼承而不是具有中止和關閉方法。 (當然它也從IService2繼承)。 – dvdvorle 2011-03-09 14:15:42

3

由於Wcf強加的要求,您的接口受到了干擾。如果你沒有使用wcf,你將不會有Open和Close方法。在理想的世界裏,界面應該看起來就像服務正在進行一樣。

您是否選擇了IoC容器?如果你還沒有,我會考慮看看Windsor。這將允許您維護一個乾淨的界面,並將服務作爲進程內對象或wcf代理注入。

container = new WindsorContainer().AddFacility<WcfFacility>(); 

container.Register(Component 
    .For<IClientService2>() 
    .ActAs(DefaultClientModel) 
    .On(WcfEndpoint.FromConfiguration("YourServiceNameInConfiguration"))) 
    .LifeStyle.Transient); 

WcfFacility將爲您打開和關閉所有頻道。

+0

有趣。我之前在服務端使用過Windsor WCF項目,但不知道客戶端的東西。不幸的是,我必須使用Unity。 – 2010-11-26 09:49:20

+0

我之前使用過Unity的時候是相對較新的,如果類似的東西沒有實現,我會感到驚訝。 – Bronumski 2010-11-26 11:22:41