C# 更新API和自定义RDB

C# 更新API和自定义RDB,c#,design-patterns,oop,C#,Design Patterns,Oop,所以 我目前正在做一个项目,其中两个不同的数据源将被更新 业务对象具有相似的结构,但并不完全相同 我目前计划做的是使用提供者接口,所以我有一个处理程序类来推送到两个数据库 由于第二个对象来自一个外部API,我认为最好的办法是将我的自定义对象推到API的提供程序中,手动映射,这样其他实现表单等的开发人员就可以轻松地完成所有这些工作 我想我总是要在某个时候重新进行映射,但我想知道是否有人有更好的方法,只在实现的方法中进行映射-下面是我目前想法的框架。。有什么想法吗 IBusinessObject1P

所以

我目前正在做一个项目,其中两个不同的数据源将被更新

业务对象具有相似的结构,但并不完全相同

我目前计划做的是使用提供者接口,所以我有一个处理程序类来推送到两个数据库

由于第二个对象来自一个外部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的例外情况
  • 因此,基本上,只要字段名和类型匹配,就可以将属性从自定义对象复制到api对象(您可以使用属性或其他东西对此进行一些规范);您可以使用反射和动态表达式快速可靠地执行此操作

    要指定第一条规则的例外情况(例如示例中的
    ob1.Name=obPassedThrough.FirstName+obPassedThrough.LastName;
    ),必须指定所需的行为。您可以在使用某种通用转换模式的代码中执行此操作,也可以在XML或其他形式中指定此操作


    通过这种方式,您应该能够创建非常简单的代码,将各种对象发布到您自己的数据库和第三方。两边都相同的普通对象可以立即工作,开发人员可以轻松实现奇怪的行为。

    最好的解决方案可能是使用

    定义一个包含所需API的接口,该接口不是特定于某个实现的,然后定义两个适配器(每个数据源一个适配器,用于实现该接口),每个适配器将其转换为底层API

    这种方法将允许您替换任何一个数据源,而无需更改上面的适配器


    如果您需要一个简短的示例,请留下评论。

    因为您的数据存储很可能会失去同步。最好在本地数据库中设置某种状态标志,例如:-

    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;
    

    然后,您将能够从大多数错误情况中恢复。

    这与我所期望的答案有点接近。我认为使用这个或我建议的提供者模型可以有效地解决相同的问题。