私の経験は、既に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がinsert
とdelete
を呼び出すときを知っていて、それに応じて別の関数を呼び出します(同様にWebインターフェイスも同様です)。 Webフレームワークを使用している場合、これはWebインターフェイス部分のurlconfigと同じです。
それも私の問題でした。しかし、通常のアプリケーションではどうすれば使用できますか? メインアプリケーション(ウェブ上) これはAPIを介してデスクトップアプリケーションとリンクしています。または、APIをDBへのインターフェイスとして扱う必要があります。また、WebアプリケーションもAPIを使用してデータを取得し、取得しますか? –
2番目のアプローチには間違いありません。モデルを他のコンポーネントから切り離すことができれば、winformsインターフェースと同じくらい簡単にWebインターフェースを(ほぼ)使用することができます。 – em70
後でリファクタリングする必要があるときは、APIのすべての機能を実行し、必要に応じて新しいフィールドを公開することができます。密接に結合されたインターフェイスを使用すると、機能が大幅に変更されます痛い –