2012-03-26 16 views
0

私は次のシナリオのために設計しようとしていますが、私の周りに私の頭を得ることはできません。アプリケーション設計/アーキテクチャ

私はアプリケーションが実行する必要があるタスクを表すレコードをデータベーステーブルに持っています。各レコードは特定のC#関数にマップされます。テーブルに行を追加するには、特定のタスクを作成してアプリケーションを再構築する必要があります。

これまでのところ、基本クラスを追加して、新しい機能を追加する必要があるたびに新しいクラスを作成しました。

基本クラス:
public abstract class TaskBase
{ public abstract void DoWork(); }

public sealed class Task001: TaskBase
{ public override void DoWork() { /* Record-specific code */ } }

public sealed class Task002: TaskBase
{ public override void DoWork() { /* Record-specific code */ } }

これは私がそこに行くことはありませんので、実行する必要がある理由を説明することは困難です。デザインと実用性の面でこれを達成するより良い方法があると確信していますが。助言がありますか?私はC#を使用しています。そして、.NETの反射機能が本当に助けになります。

+1

タスクの性質にもよりますが、コードをデータベースに格納し、リフレクションを使用してコードを発行すると、毎回リビルドする必要がなくなります。 IronPythonまたはIronRubyも可能です。 –

+0

興味深い。私はこの実装とセキュリティの関係を評価する必要があります。実装では、コンパイル時エラーにアクセスできないため、コードをデータベースに追加する前にテストする必要があります。しかし、良い提案。 –

+0

テストのために、ちょっとしたアプリを書く。確かに、dbへの外部アクセスがあれば、何らかの形の暗号化が行われます。 facillitateしたいSQLインジェクションエラーの種類ではありません.... –

答えて

0

ジェネリックDLLのインターフェイスとしてベースクラスを作成し、各タスクに対して、ベースインターフェイスに基づくタスクドックの実装で新しいDLLを作成する必要があります。

データベースでは、各行に対して、TAKS DLLパスを追加できます(または、アセンブリ名を追加して、すべてのDLLを事前定義されたディレクトリにインストールすることができます)。次に、.NETのリフレクションを使用して、TASKアセンブリを読み込み、ベースインターフェイスに基づいて「DoWork」メソッドをすべて呼び出すことができます。

これは、タスクdllがあらかじめコンパイルされ、より安全になるため、コードをDBに格納する方がよいです。また、新しいタスクが追加されるたびにメインアプリケーションを再構築する必要はありません。

関連する問題