2009-04-23 38 views
0

我目前正在编写一个网络软件,该软件也将由客户端桌面通过API使用。 我现在面临的问题是:我是否应该实施在应用程序中两次添加/更新/删除对象的每个操作?一旦它位于正常的代码中,并且一旦隔离了API?为我的软件创建一个API - 基本代码结构

或者我应该更喜欢使用OOP模型类的系统来代表我的数据库中的所有对象,并将它们用于API和普通代码?

或者开发API并从我的正常Web界面使用它?

这是我一直想知道的。提前致谢!

回答

3

做事情两次几乎总是一个坏主意 - 你可能会更好地执行API,打开它的最终用户,也使用它的客户端代码以及一些额外的挂钩这是特定于接口的东西。

+0

这也是我的问题。但是,我会在正常的应用程序中使用什么呢? 它将是: 主要应用程序(在网络上) 这是通过API链接到桌面应用程序。或者,我应该将API作为数据库的接口,我的Web应用程序也使用API​​来获取和检索数据? – 2009-04-23 19:42:04

+0

你一定会选择第二种方法。如果你可以将模型从其他组件中分离出来,你就可以像使用winforms接口一样简单地使用web界面。 – em70 2009-04-23 19:47:45

2

这就是为什么我们有REST(和SOAP)协议。

桌面向您的Web应用程序发出RESTful请求。您的Web应用程序收到REST请求并执行真正的工作。

您的代码只存在于一个地方 - 网络。

2

首先让我说,我的经验是与Django,这是一个丰富的Web框架,已经提供了一个ORM。我必须创建模型来表示我的对象;我执行没有原始的SQL。

所以自然我会推荐你​​的第二种方法。马上我会说你的第三种做法会让人头疼。为什么?因为你想要做不同的后期处理。这就是游戏的本质。当你在网络上放置一个CRUD界面时,有些东西将被存储为模型中的字段,用户甚至不会从CRUD页面中识别出来。作为一个例子,我有一个CRUD页面,用于有不同公司关联的新闻报道。 (这是一个数据库外键。)当然,这是通过登录信息自动提供的。但是登录到网页(以及登录存储的地方)的过程将与远程API非常不同。

我的首选是结合你的前两种方法的一小部分。每次保存对象时都应该出现应该发生的操作。把它们放在save()方法中(或者如果你想把事情分解得更多一些,可以用update()insert())。你不应该考虑两次实现这个功能。

但是,在Web界面和远程API中会出现不同的反序列化/对象构造和验证。这确实应该分开实施。

也可以将验证视为与反序列化本质上不同,并且认为某些规则将是相同的,而其他规则将会不同。例如,在Web界面中,我知道当我收到故事时,我自己为modification_time加盖邮票,而对于远程API,我相信客户需要加盖邮票。这是故意的。另一方面,任何没有标签的故事必须收到default标签,无论它来自哪里。您可能更喜欢在构造对象后让自己的验证器对象插入。

一个代码示例(在python):

def handle_remote_update(serialized_object): 
    #do some parsing 
    model_object = ModelObject(...)#fill in with parsed values 
    validator1.validate(model_object) 
    validator3.validate(model_object) 
    model_object.save()#All database code is in this method 
    #If you have to log to your system or notify listeners, that's also in this method 

def handle_web_submission(post_dict): 
    #do some parsing 
    model_object = ModelObject(...)#fill in with parsed values 
    validator2.validate(model_object)#This wasn't executed above 
    validator3.validate(model_object)#This was 
    model_object.save()#Same code gets executed down here as above 

当然,我只处理的insert或可能update的情况。你需要什么调用这些函数是一些方法分离器,知道什么时候远程API调用insertdelete并相应地调用不同的函数(以及类似的Web界面)。如果您使用的是Web框架,这很可能是您的Web界面部分的urlconfig。

1

REST几乎已经成为为客户端提供API在网络上的标准,并为您提供了很大的灵活性&电源。如果你在.net平台上工作,你可以实际使用ASTORIA [ADO.Net数据服务],它通过映射数据库对象来生成基于REST的Web服务。