2013-04-05 38 views
0

我試圖做的是以下幾點:WCF - 從服務實現中調用方法

1)我有以下WCF服務合同:

[ServiceContract] 
public interface IUploadService 
{ 
    [OperationContract] 
    ServiceData Upload(Request request); 
} 

[DataContract] 
public class Request 
{ 
    [DataMember] 
    public long AbnNumber; 

    [DataMember] 
    public string Email; 
} 

2)本合同是這樣實現的。

public class UploadService : IUploadService 
{ 
    public bool Upload(Request request) 
    { 
     // Some code 
    } 
} 

在「一些代碼」節中,我想打電話給一個驗證類來驗證客戶的要求,所以是這樣的:

var result = validation.ValidateRequest(request); 

所以我的問題是:這是一個壞主意在Upload方法內創建我的驗證類的實例?就像這樣:

public class UploadService : IUploadService 
{ 
    public bool Upload(Request request) 
    { 
     var validation = new Validation(); 

     var result = validation.ValidateRequest(request); 
    } 
} 

我知道你可以通過創建一個構造函數解決這個問題,但據我所知,你不能創建一個WCF服務實現類的內部構造,還是我錯了?

我是WCF的新手,所以如果我完全走錯了方向,請告訴我。

謝謝

回答

1

我個人很喜歡我的服務方式。我會有一個單獨的項目來處理上傳。這樣就可以更輕鬆地重用此代碼,並在不創建服務的情況下測試功能。

至於是否應該像這樣創建驗證,它確實取決於它的功能,但通常我會確保Validation類實現包含ValidateRequest(Request)的接口,然後注入它。如果需要,您可以在測試中嘲笑它。

所以,你的服務代碼看起來像

public class UploadService : IUploadService 
{ 
    private readonly IUploadHandler _uploadHandler; 

    public UploadService(IUploadHandler uploadHandler) 
    { 
     _uploadHandler = uploadHandler; 
    } 

    public bool Upload(Request request) 
    { 
     //would possibly do some mapping here to create a different type of object to pass to the handler 
     _uploadHandler.Upload(request); 
    } 
} 

,並在不同的項目的處理程序將看起來像

public class UploadHandler : IUploadHandler 
{ 
    private readonly IValidation _validator; 

    public UploadHandler(IValidation validator) 
    { 
     _validator = validator; 
    } 

    public bool Upload(Request request) 
    { 
     return _validator.ValidateRequest(request); 
    } 
} 
+0

感謝您的回覆。我試圖實現您的建議,並遇到以下問題: 當具有帶參數的構造函數時,我的Web服務失敗。然後我嘗試添加一個默認的構造函數到我的'UploadService'類中,像這樣: 'public UploadService(){}' 當我執行'_uploadHandler.Upload(request)時,web服務現在可以工作,但'_uploadHandler'爲null。 ;' 有沒有真正簡單的我失蹤? – 2013-04-06 01:02:24

0

所以我的問題是:它是一個壞主意,創建Upload方法中的驗證類的實例?

這涉及您是否會使用Singleton或Per Call服務。通常最好爲每個請求創建一個新的服務實例,在這種情況下,可以在您的操作中創建所有實例。

有關這個主題的有趣的討論Should WCF service typically be singleton or not?

如果您決定不創建驗證類每個然後請求有兩種選擇:

  1. 讓它單身
  2. 爲您服務創建自定義ServiceHostFactory並在其中初始化您的服務(帶構造函數)。此主題的有用鏈接:Extending Hosting Using ServiceHostFactoryIntegrating StructureMap with WCF