2010-03-04 52 views
0

我很好奇別人怎麼處理這種情況。我有一個包含Address對象的域圖層。然後我有一個使用這個對象的應用程序。此外,還有一個asp.net asmx Web服務,通​​過發送到第三方Web服務來執行地址驗證。用網絡引用分離組件

我很好奇如何處理這個功能。我不想讓服務引用和代碼訪問域圖層中的Web服務。把它放在應用程序層中似乎也是錯誤的。

我目前最好的解決方案是創建第三個程序集,該程序集引用原始域圖層和驗證Web服務。這使我的域圖層更清晰,沒有外部引用。你將如何處理這種情況?

回答

0

那麼,是驗證應用程序(UI)邏輯的地址部分還是部分域名要求?

如果它是一個應用程序功能,它會進入應用程序層。如果它是一個核心域功能,它將進入域層。

如果您擔心耦合 - 例如,如果您認爲將來可能決定使用不同的地址驗證服務 - 請在其上放置一個抽象。創建一個接口和包裝類:

public interface IAddressValidator 
{ 
    bool ValidateAddress(Address address); 
} 

public class FooAddressValidator : IAddressValidator 
{ 
    private FooService service; 

    public FooAddressValidator(FooService service) 
    { 
     this.service = service; 
    } 

    public bool ValidateAddress(Address address) 
    { 
     return service.ValidateAddress(address.StreetLine1, address.City, 
      address.State, address.Country); 
    } 
} 

或者任何邏輯。然後使您的應用程序(或域模型)依賴於IAddressValidator而不是服務本身,並從最外層的實例中煽風點擊實例IAddressValidator

你可以把核心IAddressValidator界面在你的領域模型,並保持FooAddressValidator在唯一有史以來可執行文件引用的外部組件。這樣,你的域名實際上並不依賴於Web服務,但你仍然有地址驗證作爲你的域邏輯的一部分。

這也使地址驗證組件更容易測試,因爲您實際上不需要進行Web服務調用,您可以使用不同的MockAddressValidator實例。

+0

感謝您的建議。我想這是一個核心域功能,任何應用程序都應該能夠驗證一個地址。再次感謝。 – 2010-03-04 18:34:03