従来の非階層 (2 層) Delphi win32 アプリケーションに Web インターフェイスを追加するためのトリックとして Web (イントラウェブ) 用 VCL を使用することは意味がありますか?
-
26-09-2019 - |
質問
私のチームは、巨大な Client Server win32 Delphi アプリケーションを保守しています。これは、DevArt (SDAC) コンポーネントを使用して SQL Server に接続するクライアント/サーバー アプリケーション (シック クライアント) です。
ビジネス ロジックはコンポーネントのイベント ハンドラーに「閉じ込められる」ことがよくありますが、いずれにせよ、ある程度のリファクタリングを行うことで、ビジネス ロジックを共通の単位で移動することが可能になります (この作業の大部分はリファクタリング中にすでに行われています...)他の人が作成したレガシー アプリケーションを保守するのは非常にイライラしますが、これは非常に一般的な仕事です)。
ここで Web インターフェイスの要求があります。もちろん、いくつかのオプションがあります。この質問では、Web (イントラウェブ) 用の VCL オプションに焦点を当てたいと思います。
考え方は、クライアント/サーバー アプリケーションと Web アプリケーションの両方に共通のコード (同じ pas ファイル) を使用することです。レガシーアプリをデルファイからイントラウェブに移行した人はたくさんいると聞いていますが、ここではシッククライアントも維持しようとしています。
アイデアは共通のコードを使用することですが、特定のコードを記述するためにいくつかのコンパイラ ディレクティブを使用することもあります。
{$IFDEF CLIENTSERVER}
{here goes the thick client specific code}
{$ELSE}
{here goes the Intraweb specific code}
{$ENDIF}
次に、もう 1 つの問題は「移行計画」です。たとえば、300 個の機能があり、最初のリリースでは、そのうちの 50 個だけが Web アプリケーションで使用できるとします。それを追跡するにはどうすればよいですか?私はこれを処理するために Delphi インターフェイスを(ab)使用することを考えていました。たとえば、ユーザー認証の場合、関連するすべてのコードをプロシージャに移動し、次のようなインターフェイスを宣言できます。
type
IUserAuthentication= interface['{0D57624C-CDDE-458B-A36C-436AE465B477}']
procedure UserAuthentication;
end;
このようにして、両方のアプリケーション (シック クライアントとイントラウェブ) に IUserAuthentication インターフェイスを実装すると、その機能が Web に「移植」されたことがわかります。とにかく、このアプローチが意味があるかどうかはわかりません。プロセス全体をシミュレーションするためにプロトタイプを作成しました。これは「Hello world」アプリケーションでは機能しますが、大規模なアプリケーションでは意味があるのか、それともこのインターフェイスのアイデアは逆効果でしかなく、逆効果になる可能性があるのか疑問です。
私の質問は次のとおりです。このアプローチは意味がありますか?(インターフェイスのアイデアは単なる追加のアイデアであり、上記の共通コード部分ほど重要ではありません) それは実行可能なオプションですか?
アプリケーションの種類に大きく依存することは理解していますが、一般的に言えば、私のアプリケーションはCRM/会計ドメインにあり、単一インストールの同時ユーザー数は通常20人未満で、ピークは50人です。
追加コメント (更新):私は n 層アプリケーションを持っていないので、Intraweb がシック クライアントと共通のコードを持つ Web アプリケーションを持つためのユニークなオプションであると考えているため、この質問をします。私の特定のケースでは、Delphi コードから Web サービスを開発することは意味がありません。そのため、代替手段として、ASP.NET を使用して Web インターフェイスを作成する (ビジネス ロジックを複製する) という方法がありますが、この場合、共通のコードを利用することはできません。簡単な方法。はい、DLL を使用することもできますが、私のコードはそれには適していません。
解決
覚えておくべき最も重要なことは次のとおりです。
- シック クライアントの .EXE プロセスは、一度に 1 人のユーザーによって使用されます (複数のユーザーがその .EXE の複数のインスタンスを持つことになります)。
- Web 内 .EXE プロセスは、一度に多くの人によって使用されます。これらはすべて、プロセスの同じインスタンスを共有します。
つまり、ビジネス ロジックを共通のユニットにリファクタリングするだけでなく、ビジネス ロジックのインスタンスがメモリ内に複数回常駐でき、干渉しない必要があります。
これは、データベースと通信するビジネス ロジックから始まります。同時に複数のデータベース接続ができる必要があります (実際には、データベース接続のプールが最適に機能します)。
私の経験では、ビジネス ロジックをデータモジュールにリファクタリングできれば、アプリのイントラウェブ バージョンとシック クライアント バージョンの両方をサポートするための良い出発点が得られます。
ユーザー インターフェイスを忘れてはなりません。
- シック クライアントはモーダル フォームをサポートし、より豊富な UI を備えています。
- Web ブラウザはメッセージ ダイアログのみをサポートします (その後:それらは非常に限られています)、派手な UI のものはすべて開発に多くの時間がかかります (ただし、たとえば、TMS にはいくつかの機能があります) イントラウェブ用の優れたコンポーネント)
さらに、HTTP プロトコルのステートレスな性質にも対処する必要があります。これを克服するにはセッションが必要です。Intraweb はセッション部分の大部分を処理します。
しかし、次のような質問を自分自身に問いかける必要があります。
- ユーザーが XX 分間アイドル状態だった場合はどうなりますか?
- どれくらいのセッション状態をメモリに保存できますか?そしてそれが合わなかったらどうしますか?
- メモリに収まらないセッション状態はどうすればよいですか?
これは単なる始まりですので、さらに詳しい情報が必要な場合はお知らせください。
あなたのアプリに非常に特殊な問題がある場合は、いつでも私に直接連絡してください。ググってみてください。
--ジェローン
他のヒント
私は、あなたがn階層にアプリケーションを移動した場合、それが容易になりますよりよい解決策になると思うのデスクトップやWebアプリケーションで使用されるようにその後ます。
あなたはすでにあなたが使用することができ、プレゼンテーションからビジネスロジックを分離することで最初の部分を作った RemObject のSDKまたはDataSnapのデルファイにバンドルされていること。
あなたはデスクトップ・アプリケーションで作業しているだろう、とあなたはWebパーツのIntrawebm Asp.netや、これまで何を使用することができ、その後、このようにあなたがWebパーツのために再度ビジネス・ロジックを複製する必要はありません。
通常、彼らは別の環境で作業し、あなたはそれの本質として、各1を構築する必要がありますので、あなたが、思った通りではない簡単にウェブにデスクトップアプリケーションを変換します。