2009-10-12 38 views
1

所以,更新API和自定義RDB

我目前正在開發一個項目,其中將更新兩個不同的數據源。

業務對象具有相似的結構,但不完全相同。

我目前計劃做的是使用提供者接口,所以我有一個處理程序類來推送到兩個數據庫。由於第二個對象來自外部API,我認爲最好的做法是推送自定義對象,並在API提供程序中手動映射事件,以便其他開發人員實現表單等。因爲這將能夠無縫地做到這一切。

我想我總是需要在某些時候做映射,但我想知道是否有人在實現的方法中做了一個更好的方法 - 下面是我目前想的東西的骨架。 。 有任何想法嗎?

IBusinessObject1PushProvider 
{ 
    Create(); 
} 


DSOneBusinessObject1Pusher : IBusinessObject1PushProvider 
{ 
    Create() 
    { 
     // move custom object into our database 
    } 
} 

DSTwoBusinessObject1Pusher : IBusinessObject1PushProvider 
{ 
    Create() 
    { 
     APIObj1 ob1 = new APIObj1(); 
     ob1.Name = obPassedThrough.FirstName + obPassedThrough.LastName; 

     // move ob1 to the webservice having had the datamassaged. 
    } 
} 

回答

1

最好的解決方案可能是使用adapter pattern

定義一個涵蓋所需API的接口,它不是特定於某個實現的接口,然後定義兩個適配器 - 每個數據源一個,實現接口 - 每個都將其轉換爲底層API。

這種方法將允許您替換任何一個數據源而不改變任何東西,只是它上面的適配器。

如果你需要一個簡短的例子發表評論。

+0

這是最接近我期待的答案。我認爲使用這個或我所建議的提供者模型是有效的。 – tim 2009-11-02 13:57:37

1

那麼我的想法實現這樣的功能時,會:

  1. 假設一個一對一的映射是正常行爲
  2. 指定例外規則1

所以基本上,只要fieldNames和類型匹配(可以使用屬性或其他方法對此進行一些說明),將屬性從自定義對象複製到api對象;你可以使用反射和動態表達式來做到這一點快速和可靠。

要指定第一條規則的例外情況(例如您的示例中的ob1.Name = obPassedThrough.FirstName + obPassedThrough.LastName;),您必須指定想要的行爲。您可以使用某種通用轉換模式在代碼中執行此操作,也可以使用XML或其他方式指定它。

這種方式你應該能夠創建相當簡單的代碼來發布各種對象到你自己的數據庫和第三方。普通對象在雙方都是一樣的,並且開發人員可以很容易地執行奇怪的行爲。

0

由於數據存儲明顯可能不同步。這將是一個不錯的主意,有某種狀態標誌在你本地數據庫是這樣的: -

set local_stat = IN_PROGRESS; 
id = create(the_data,local_stat); 
commit; 
send to remote_service(); 
if (ok) 
then 
    set local_stat = IN_SYNC; 
else 
    set local_stat = OUT_OF_SYNC; 
update(id,local_stat); 
commit; 

然後,您將能夠從最錯誤狀況恢復。