2008-09-05 9 views
7

私はC#3.0、wpf、および.Net 3.5を学ぶために単純なデスクトップアプリケーションを作成しました。 私のアプリケーションは、本質的にcsvファイルからデータを読み込み、それをSQLサーバーのCEデータベースに格納します。私はsqlmetalを使用してデータベースのORMコードを生成します。 このアプリの私の最初の反復は地獄のように醜いです。私はそれをリファクタリングする過程にいます。どのようにC#3.0のデスクトップアプリケーションを設計しますか

これは私の質問に私をもたらします。どのようにC#でデスクトップデータベースアプリケーションを設計しますか? ベストプラクティスは何ですか?

sqlmetal生成コードを使用するデータベース抽象化レイヤ(DAL)を作成していますか?または、生成されたコードは抽象化のために十分ですか?

DALパターンを使用する場合は、それをシングルトンメンバーまたはスタティックメンバーにしますか? DALパターンでView-Model-ModelViewパターンを使用していますか?

これは長い間開いている質問のように思えますが、私はこれに最近多くの考えを与えています。 C#でエンタープライズのn層アプリケーションを設計する方法の例はたくさんありますが、スタンドアロンのデスクトップアプリケーションを設計する場合はそれほど多くありません。

答えて

4

私はMicrosoftのP & PチームからComposite Application Guidance for WPF PRISM )で開始します。ダウンロードでは、今日の私のWPF開発の大部分の出発点である素晴らしいリファレンスアプリケーションが提供されます。

DotNetRocks crewは、より多くの情報を聞くことに興味がある場合は、これについてGlenn BlockBrian Noyesにちょうどインタビューしました。

さらに、WinFormsの時代に慣れていれば、PrismはCABと同じくらい重くはありません。

1

何かを設計する前に、アプリケーションの要件を定義する必要があります。
初心者向けの開発者の一般的なエラーです。まず、コードの作成方法を考える前にコードを書き始めます。私のアドバイスは、あなたのアプリケーションのいくつかの機能を記述しようとすることです。それがどのように実装されるべきかを感じるのに役立ちます。

有用な学習リソースについては、CompositeWPFをご覧になることを強くお勧めします。これは、開発者にデスクトップアプリケーション開発のベストプラクティスを教えるために特別に設計されたプロジェクトです。

2

答えはいつものように「それに依存する」です。

いくつかのことについて考えてみましょう: このファットクライアントアプリケーションをある時点で(たとえば)ウェブアプリケーションにしたいと思うかもしれません。その場合は、ビジネスレイヤー(およびそれ以下)とプレゼンテーションを分離しておく必要があります。これを行う最も簡単な方法は、ビジネスロジックへのすべての呼び出しが何らかの種類のインターフェイスを経由することです。より複雑な方法は、完全なMVC設定を実装することです。

もう1つのことは、データアクセスレイヤをビジネスロジックとユーザーインターフェイスから独立させることです。これにより、ビジネスロジックからDALへのすべての呼び出しは、「SQLからこのデータを取得する」よりも「このSQL文を実行する」よりも「一般的な」データである必要があります。このようにして、DALを別のデータベース、XMLファイル、またはフラットファイルのような何かにアクセスするものに置き換えることができます。

要するに、懸念の分離。これにより、別のUIを追加したり、3つの領域をそれぞれ別の層に分割したり、関連する技術を変更することで、将来的に成長することができます。

0

私はそう言うでしょう。小さなアプリケーションに向けて簡単に構成することができます。開始に向けた学習曲線がありますが、正直言って、WPFを最初からやり直すよりも理解しやすくなりました。 CompositeWPFでプロジェクトを開始してから別のプロジェクトを開始した後、私は自分自身でCompositeWPFの機能を複製しようとしていました。 :)

1

私は、Jeremy MillerのBuild Your Own Cabシリーズから始めたいと思います。

私は初期のCABアダプターでした。私はその技術を掘り下げ、アプリケーション・アーキテクチャーに関するすべての.NETブログを読むことから多くを学びました。

最近、私は新しいプロジェクトを開始する機会がありました.CABを使用する代わりに、StructureMap & NHibernateに行き、Jeremyが使用するパターン(特に、イベント集約を扱う方法)の一部を借りました。その結果、本当に単純化された、手作業で作られたフレームワークが必要なすべてを行い、私はそれを扱うことが大好きです。

質問の内容について:私はデータアクセスのためにリポジトリを使用します。私は最初にいくつかのADO.NETコードを書いて、データリーダーとオブジェクトをマップしました。しかし、それは本当に早くなったので、私はNHibernateをつかんで、本当に満足していました。リポジトリはデータアクセスにNHibernateを使用しており、この特定のアプリケーションではデータアクセスの必要性は非常に簡単です。

私は、リポジトリを利用するサービス層(WCF、Duplexチャネルで公開されている)を持っています。私のアプリは基本的にリアルタイムの更新を伴うクライアント/サーバーです(あなたの質問はクライアントに関するものだと知っていますが、私は同じ技術とパターンを使用します)。 O

nクライアント側IoC用のStructureMapでMVPを使用し、クラス間通信用の非常に単純なイベント集約戦略を使用します。私はすべてのもののためにインターフェイスにコード化します。私がした唯一の他の事は、CABから、ビューを動的に表示するための柔軟な「ワークスペース」という考えを借りたことでした。私は独自のワークスペースインターフェイスを作成し、自分のアプリケーションで使用するために自分自身のDeckWorkspaceとTableWorkspaceを実装しました(これは本当に簡単なものです)。

この最新のアプリケーションでの多くの決定は、他のフレームワークやツールを使用したときの経験や痛みの結果でした。今回私は別の決定をしました。アプリケーションを設計する方法を実際に理解する唯一の方法は、あらかじめ間違っているという苦痛を感じることです。

関連する問題