我很好奇別人怎麼處理這種情況。我有一個包含Address對象的域圖層。然後我有一個使用這個對象的應用程序。此外,還有一個asp.net asmx Web服務,通過發送到第三方Web服務來執行地址驗證。用網絡引用分離組件
我很好奇如何處理這個功能。我不想讓服務引用和代碼訪問域圖層中的Web服務。把它放在應用程序層中似乎也是錯誤的。
我目前最好的解決方案是創建第三個程序集,該程序集引用原始域圖層和驗證Web服務。這使我的域圖層更清晰,沒有外部引用。你將如何處理這種情況?
我很好奇別人怎麼處理這種情況。我有一個包含Address對象的域圖層。然後我有一個使用這個對象的應用程序。此外,還有一個asp.net asmx Web服務,通過發送到第三方Web服務來執行地址驗證。用網絡引用分離組件
我很好奇如何處理這個功能。我不想讓服務引用和代碼訪問域圖層中的Web服務。把它放在應用程序層中似乎也是錯誤的。
我目前最好的解決方案是創建第三個程序集,該程序集引用原始域圖層和驗證Web服務。這使我的域圖層更清晰,沒有外部引用。你將如何處理這種情況?
那麼,是驗證應用程序(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
實例。
感謝您的建議。我想這是一個核心域功能,任何應用程序都應該能夠驗證一個地址。再次感謝。 – 2010-03-04 18:34:03