1

Combinator parsers( http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html ) が、REST サービスのルーティング規則を処理する設計で機能することを願っています。 Scalatra( http://tutorialbin.com/tutorials/80408/infoq-scalatra-a-sinatra-like-web-framework-for-scala )で実装されています。

この REST サービスはプロキシとして機能し、外部アプリケーションがファイアウォール内のサービスにアクセスできるようにします。これは、各 REST サービスのビジネス要件に合わせてカスタマイズできる追加のセキュリティ レイヤーがあるためです。

したがって、ある人が自分のクラス スケジュールにアクセスしたい場合は、誰かの成績証明書を見たい場合よりもセキュリティが低くなります。

実際に情報を取得するための場所、情報を返す方法、および必要なセキュリティについてのルールを DSL で示してください。

しかし、最初の問題は、DSL に基づいて REST サービスのルーティング ルールを動的に変更する方法です。新しいルールを追加するために大量の再コンパイルを必要とせず、適切なルールを記述するだけのフレームワークを作成しようとしているからです。スクリプトを作成し、そのまま処理させます。

では、Scala で Combinator パーサーを使用して DSL を実装し、JAX-RS ( http://download.oracle.com/javaee/6/tutorial/doc/giepu.html ) が動的にルーティングを変更できるようにすることはできますか?

アップデート:

私はまだ言語を設計していませんが、これは私がやろうとしていることです:

route /transcript using action GET to   
http://inside.com/transcript/{firstparam}/2011/{secondparam} 
return json encrypt with public key from /mnt/publickey.txt

for /education_cost using action GET combine http://combine.com/SOAP/costeducate with 
http://combine.com/education_benefit/2010 with 
http://combine.com/education_benefit/2011 return html

これらは、トランスクリプトのリクエストのルールがファイアウォール内などの別のサイトに送信され、データが暗号化されて返される場合に考えられる 2 つのアイデアです。

2 つ目は、SOAP と 2 つの REST 要求の結果が結合されるという点でより複雑になります。これを結合する方法について追加のコマンドが必要になりますが、アイデアは、これらすべてを解析可能なファイルに入れることです。急いで。

Groovy を使用した場合、ルーティング用にいくつかの新しいクラスが生成され、パフォーマンス ヒットが解消される可能性がありますが、パフォーマンス ヒットが発生したとしても、Scala を使用するのが最善の策だと思います。

私の希望は、OOP や関数型言語をまったく知らない人でも新しいルーティング ルールを記述できるように、より保守しやすいフレームワークを作成することですが、仕様はSpecs( http://code.google.com/p /specs/ ) 機能面で、要件が定期的にテストされていることを確認できます。

更新 2:

デザインに取り組み始めると、いくつかのオプションを直感的に理解できますが、その理由はわかりません。今日、Groovy がこれに対するより良い修正である理由は、メタプログラミング ( http://www.justinspradlin.com/programming/groovy-metaprogramming-adding-behavior- dynamic/ )、その後、Scala または Groovy を使用して、生成されたルーティングを動的に使用できます。クラスがまだ存在しない場合、Scala にクラスを生成させる方法がわかりません。

Groovy では、他のいくつかの言語と同様に、ここ ( http://langexplr.blogspot.com/2008/02/handling-call-to-missing-method-in.html ) に示すように、メソッドが欠落している場合、動的に実行できますメソッドを生成すると、それ以降存在するため、1回欠落します。

これを機能させるには、Groovy と Java を組み合わせる必要があるように思われますが、REST サービスのルーティングのために、一部のコードが Scala にあり、一部が Java にあるという結果になる可能性があります。

4

1 に答える 1

3

質問を 2 つの部分に分割します。

Combinator Parser を使用して DSL を実装できますか

はい。コンビネーターパーサーや他の種類のパーサーを使用しても実装できないものがあります。たとえば、Perl 自体は解析できません (評価する必要があります)。また、コンビネーター パーサーは、複雑な言語 (Scala など - そのコンパイラーはコンビネーター パーサーに基づいていない) や、最高のパフォーマンスが必要な場合 (数十万行のコードをコンパイルするために使用されるコンパイラーなど) には特に適していません。

ただし、そのような極端な方法を使用する場合は、パーサーの選択が主な問題になることはありません。平均的な複雑さの DSL の場合、問題なく機能します。

これにより、JAX-RS がルーティングを動的に変更できるようになります

ええと、私は JAX-RS を知りませんが、動的に変更されたルーティングを JAX-RS で行うことができれば、コンビネーター パーサーは必要な入力を提供できるようになります。

編集

あなたの例を見て、パーサーコンビネーターは確かに十分だと思います。彼らの結果から、BlueEyes バインダーを動的に作成できると思います。私は BlueEyes を使用したことがないので、どれだけ動的かはわかりません。

もう 1 つの選択肢は、Lift を使用することです。Lift のバインダーは部分的な機能であり、通常のすべての方法で組み合わせることができます -- f1 orElse f2f1 andThen f2など。セッションで最も頻繁に使用されるため、最初は提案しませんでしたが、RESTful モデルを備えていると思います。ステートレスです。

Scalatra は知らないので、これに適応するかどうかはわかりません。

于 2011-06-18T02:09:17.613 に答える