2010-08-04 60 views
2

我正在尋找一些關於我正在創建的應用程序的體系結構的指導。這裏是情況:從模型內部或外部調用Web服務?

我們公司給銷售員發獎勵卡,然後分發給客戶(像借記卡一樣使用)。爲了進行跟蹤,推銷員必須在使用該卡之前向我們的系統申請激活(提供關於他們給卡的人以及爲什麼的信息)。前面的應用程序是ASP.NET MVC 2.Windows服務將定期檢查激活請求,並從發出該卡的公司調用Web服務(實際上有兩個卡公司和兩個涉及的服務)來激活它。然後它將該卡的狀態標記爲在數據庫中激活。

我的解決方案分爲5個項目:Web,Data(模型和存儲庫),CompanyClients(訪問兩個Web服務),Service(Windows服務)和Tests。

就目前的立場,一些代碼在Windows服務去可能是這樣的:

using (var repo = new Repository()) 
{ 
    var cards = repo.GetAllPendingCardsWithOrderAndCompany(); 

    foreach (var card in cards) 
    { 
     var client = CompanyClientFactory.GetClient(card); 

     try 
     { 
      client.ActivateCard(card); 
      card.ActivationDt = DateTime.Now; 
     } 
     catch(Exception ex) 
     { 
      // Error logging goes here 
     } 
    } 
    repo.Save(); 
} 

這工作,但我不能幫助Anemic Domain Model問題的思考。我應該添加一個名爲Activate()的方法來獲取Web服務客戶端並嘗試真正的激活和記錄本身?這將使Windows服務更清潔:

using (var repo = new Repository()) 
{ 
    var cards = repo.GetAllPendingCardsWithOrderAndCompany(); 

    foreach (var card in cards) 
    { 
     card.Activate(); 
    } 
    repo.Save(); 
} 

但是,這將需要Data項目引用CompanyClients。 CompanyClients本身已經引用數據,所以這會創建一個循環依賴。我可以將這兩個項目合併到一起,但這對我來說並不合適(因爲它是,我最終想去POCO並將模型和數據分解到不同的項目中)。

有更好的方法來組織這個想法嗎?

回答

0

是的,我理解你的問題,你問是否可以將Dataaccess方法放在Model類上,或將它留在客戶端,這是一個包含訪問Web服務方法的項目。

我對類似的項目有類似的想法,我決定保留Model類非常簡單,他們實際上沒有任何方法,只有屬性。

此外,客戶端與Web服務建立連接的概念也不太合適。客戶還應該進入Models項目。你現在用來連接到webservices的代碼應該被移動到一個名爲WebServiceProxy的獨立項目或類似的東西。

該項目應該遵循Repository/Service pattern。鏈接的文章實際上討論了與web服務相關的存儲庫模式(除了通常的存儲庫到數據庫的東西)。

HTH

+0

謝謝。我目前有一個代理類實現客戶端訪問的接口。我將客戶端與代理放在同一個項目中,因此我的域名不需要處理自動生成的類型化數據集,但是您可能應該將它們放在一起。 – ShawnFumo 2010-08-09 12:21:41

1

最後,是否有來自內部或卡類的外部調用的答案來自一個面向對象角度思考更深刻地瞭解它。雖然乍看之下將這些功能組合在一起似乎很不錯,但卡片自身激活是沒有意義的。所以在任何情況下,它都屬於Card類之外。

至於如何分離出各種項目的問題,我認爲this answer是有道理的,它使用獨立接口,有一個很好的教程:Refactoring Service Dependencies to Separated Interface