2009-04-23 13 views
0

私は現在、APIを介してクライアントデスクトップで使用されるウェブソフトウェアを作成しています。 私が今直面している問題は、アプリケーションのオブジェクトを2回追加/更新/削除するすべてのアクションを実装する必要がありますか?一度正常なコードに座って、一度APIのために隔離された?ソフトウェアのAPIを作成する - 基本的なコード構造

または、私のデータベースのすべてのオブジェクトを表すOOPモデルクラスのシステムを使用して、APIと通常のコードの両方で使用する方がよいでしょうか?

または、APIを最初に開発して、それを私の通常のWebインターフェイスからも使用しますか?

これは私がいつも考えていたことです。前もって感謝します!

答えて

3

物事を2回することは、ほとんど常に悪い考えです。あなたはおそらくAPIを実装してエンドユーザーに公開し、クライアントコードにも使用する方がよいでしょう。インターフェイス固有のもの。

+0

それも私の問題でした。しかし、通常のアプリケーションではどうすれば使用できますか? メインアプリケーション(ウェブ上) これはAPIを介してデスクトップアプリケーションとリンクしています。または、APIをDBへのインターフェイスとして扱う必要があります。また、WebアプリケーションもAPIを使用してデータを取得し、取得しますか? –

+0

2番目のアプローチには間違いありません。モデルを他のコンポーネントから切り離すことができれば、winformsインターフェースと同じくらい簡単にWebインターフェースを(ほぼ)使用することができます。 – em70

+0

後でリファクタリングする必要があるときは、APIのすべての機能を実行し、必要に応じて新しいフィールドを公開することができます。密接に結合されたインターフェイスを使用すると、機能が大幅に変更されます痛い –

2

これは私たちがREST(およびSOAP)プロトコルを持っている理由です。

デスクトップは、Webアプリケーションに対してRESTfulなリクエストを行います。 WebアプリケーションはREST要求を受け取り、実際の作業を行います。

コードはちょうど1つの場所、つまりウェブに存在します。

2

私の経験は、既にORMを提供しているリッチなWebフレームワークであるDjangoであると言います。オブジェクトを表現するためのモデルを作成する必要があります。私は生のSQLを実行しません。

自然に私はあなたの2番目のアプローチをお勧めします。バットから離れて、私はあなたの第3のアプローチが頭痛になると言うでしょう。どうして?さまざまな後処理をしたいと思っているからです。それがゲームの性質です。 Web上にCRUDインタフェースを置くと、CRUDページから認識さえしないように、モデル内にフィールドとして格納されるものがあります。例として、私は、異なる企業が関連しているニュース記事のCRUDページを持っています。 (これはデータベースの外部キーです)当然、ログイン情報によって自動的に提供されます。しかし、Webページにログインするプロセス(およびそのログインが保存されている場所)は、リモートAPIとは大きく異なります。

私の好みは、あなたの最初の2つのアプローチの少しを組み合わせることです。オブジェクトが保存されるたびに必ず実行されるアクションが必要です。それらをsave()メソッドに入れてください(もう少し工夫したい場合はupdate()insert())。この機能を2回実装することについて考えるべきではありません。

ただし、ウェブインタフェースとリモートAPIで異なるデシリアライズ/オブジェクトの構築と検証が行われます。これは本当に別々に実装する必要があります。

また、本質的にデシリアライゼーションとは異なる検証を見て、いくつかのルールが同じで、他のルールが異なると考えているかもしれません。たとえば、Webインターフェイスでは、ストーリーを受け取ったときにmodification_timeがスタンプされますが、リモートAPIの場合はクライアントがスタンプすると信じています。これは意図的です。一方、タグがないストーリーはどこに由来するかにかかわらず、defaultタグを受信しなければならない(MUST)。オブジェクト構築後にプラグインするだけで、バリデータオブジェクトを作成することを自由に選択することができます。(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プラットフォームで作業している場合は、実際にデータベースオブジェクトをマッピングするだけで、RESTベースのWebサービスを生成するASTORIA [ADO.Net Data Services]を実際に使用することができます。

+0

WCFについて聞いたことがありますか? –

関連する問題