2009-05-11 20 views
3

私はC#で書かれたWindowsフォームアプリケーションを持っています。 main_formクラスは、main_formは、次のコードこのアプリケーションは単に「それは速い動作させる」ためにPOCから行ってきましたC#OO Design Question

 AccessProcessWorker.DoWork += new DoWorkEventHandler(processWorker.worker_DoWork); 
     AccessProcessWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(processWorkerCompleted); 
     AccessProcessWorker.ProgressChanged += new ProgressChangedEventHandler(processProgressChanged); 

でプロセスを初期化し、BackgroundWorkerのを継承するクラスであるAccessProcessWorkerという名前AccessProcessをインスタンス化します。

私はAccessデータベースに対して動作するようにこのアプリを書いていますが、今はMS Sqlに反対したいが、アクセスに対しても対処するオプションは残しておきたい。ですから、私は、ユーザーが行ったいくつかのUI選択に基づいて、SqlProcessWorkerまたはAccessProcessWorkerをインスタンス化して初期化するような、醜いことをすることができます。しかし、私がしたいのは、main_formが常にIProcessのようなものを作成するようにすることです。新しいProcessWorkerがあるたびにmain_formにロジックを追加する必要はありませんでした。私のデザインの問題は、私が記述したように初期化が中断することです。

誰かがアイデアを持っている、またはさらなるclairificationが必要な場合は私に知らせてください。

答えて

4

あなたが探しているのは「依存性注入」です。

+1

この時点ではOPのために過労かもしれないと思います。 –

+0

+1。私はそれが残念だとは思わない、確かにStructureMapでの私の経験は、このような単純なケースでもそれを使うことは価値がある(やり易い)ということです。 – Richard

2

ある時点で正しいタイプをインスタンス化する必要がありますが、通常はThe Factory Patternがここに移動します。あなたがIProcessオブジェクトを取得するために2つのタイプのうちの1つを 'new'にすることが今までにあったのであれば、ちょっとだけかもしれません。

2

これを単純にするために、私は実際には「醜い」アプローチをとっています。

あなたはAccessとSQL Serverを2つの現在のデータベースと言いましたが、実際にあなたのアプリケーションがサポートする必要があると思われるのはいくつですか?私の経験では、アプリケーションのデータベースプラットフォームはほとんど変更されておらず、真剣に考えているわけではありません。

サポートするデータベースプラットフォームが大量にあり、それを事前に予測できない場合は、デカップリングされた設計が役立つ可能性があります。そうでなければKISS。

+0

これは私が考え始めたことです...悲しいことですが、私はよりよい開発者になりたいし、この共通の問題を解決するためのより多くのツールを用意したいと思います。 – user104628

+2

これは仕事の状況に適していますか?そうであれば、将来顧客/クライアントが新しいデータベースを追加する機能を実際に求めていない限り、実際には醜いアプローチが責任ある方法です。将来的に新しいデータベースが必要な場合は、再作業と余分な作業が必要になります。それが仕事のためでないなら、確かに、それを学習経験として扱います。他の答えのいくつかは良いヒントを提供します。ところで、あなたは私にとってまともな開発者のように聞こえる。 – Ash

+0

:) ok ...はいそれは仕事のためです...私の最大の問題は、私は唯一の開発者です、私はチームを持つことに慣れています、そして、私の上司は、 SQLのライセンスの価格を見て、私たちがMySQLを使用できるかどうかについては、すべてのことを考えるようにしています。私は外国企業のために働いていましたが、英語が最初の言語であるときに要件を集めることは難しいです。私はジムのビッグヨーロッパアドベンチャーが急速に終わりに来るだろうと思う: – user104628

1

データベースのレイアウトと構造が同じ場合は、EntitySpacesを使用して、アプリケーションのデフォルト接続を変更することができます。私。データアクセスにはコードベースが1つあり、アクセスまたはSQLデータベースのどちらを必要とするかに基づいて現在の接続を設定するだけです。

+0

毎回データベースが変更されます。 – user104628

1

コードの「醜い」ビットを別の方法でラップするか、または実際にBackgroundWorkerインスタンスと同期するためにどのDBを使用するかを選択することをお勧めします。ここでの重要なポイントは、DRYの原則に従うことです:あなた自身を繰り返さないでください。

0

私は仕事のプロジェクトでは、将来のデータベースを考えずにできるだけ早くそれを行うべきだと思っています。

Sql ServerとMS Accessで既に動作するクラスはありませんか?例えば、OleDbConnection,OleDbCommand? 単純なSQLの場合、接続文字列を変更するだけで、両方のデータベースを操作できます。

残りのアプリケーションをまだコーディングしていない場合は、フレームワークを探して比較し、好きなものを選んで1日か2日かかるでしょう。それはあなたがコードを少なく書けるようにし、将来のアプリケーションではデータベースの大部分のコードの大部分を惜しまないでしょう。私は投資された時間があなたに何倍も返されることを保証します(あなたがデータベースをしばらくして使っているならば、それはです)。