2009-10-12 40 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; 

然后,您将能够从最错误状况恢复。