9

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

それが私の質問につながります。C# でデスクトップ データベース アプリをどのように設計しますか? ベストプラクティスは何ですか?

sqlmetal によって生成されたコードを使用するデータベース アブストラクション レイヤー (DAL) を作成しますか? それとも、生成されたコードは十分に抽象化されていますか?

DAL パターンを使用する場合、シングルトンまたは静的メンバーのどちらにしますか? DAL パターンで View-Model-ModelView パターンを使用していますか?

これが長いオープンエンドの質問のように思えたら申し訳ありませんが、私は最近これについて多くのことを考えてきました. C# でエンタープライズ n 層アプリを設計する方法については多くの例を目にしますが、スタンドアロン デスクトップ アプリの設計についてはそれほど多くはありません。

4

5 に答える 5

4

Microsoft の P&P チームによるWPF の複合アプリケーション ガイダンス(PRISM) から始めます。ダウンロードには、今日の私の WPF 開発のほとんどの出発点となる優れたリファレンス アプリケーションが付属しています。

DotNetRocksのクルーは、Glenn BlockBrian Noyesにこの件についてインタビューしました。

さらに良いことに、Prism は CAB ほど重くありません (WinForms の時代から慣れていれば)。

于 2008-09-05T12:59:13.703 に答える
2

答えはいつものように「場合による」です。

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

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

要するに、関心の分離です。これにより、異なる UI を追加したり、3 つの領域すべてを独自の層に分割したり、関連するテクノロジを変更したりして、将来的に成長することができます。

于 2008-09-05T13:07:38.193 に答える
1

Jeremy Miller のBuild Your Own Cabシリーズから始めましょう。

私は CAB の早期採用者でした。そのテクノロジを掘り下げ、アプリケーション アーキテクチャに関する .NET ブログをすべて読んで、多くのことを学びました。

しかし最近、新しいプロジェクトを開始する機会があり、CAB を使用する代わりに StructureMap と NHibernate を使用し、Jeremy が使用するいくつかのパターン (特に、イベント集約の処理方法) を借りました。その結果、私が必要とするすべての機能を備えた非常に単純化された手作業のフレームワークができました。

質問の詳細については、データ アクセスにリポジトリを使用しています。最初に ADO.NET コードをいくつか書き、データ リーダーを使用して、オブジェクトをマッピングしました。しかし、それはすぐに古くなったので、NHibernate を手に入れて、本当に満足しました。リポジトリはデータ アクセスに NHibernate を使用します。私のデータ アクセスのニーズは、この特定のアプリでは非常に単純です。

リポジトリを利用するサービス レイヤー (WCF、デュプレックス チャネル経由で公開) があります。私のアプリは基本的にリアルタイム更新のクライアント サーバーです (そして、あなたの質問がクライアントに関するものであることは知っていましたが、同じテクノロジとパターンを使用します)。〇

クライアント側では、IoC 用の StructureMap を備えた MVP と、クロスクラス通信用のいくつかの非常に単純なイベント集約戦略を利用しています。ほぼすべてのインターフェイスにコーディングします。私が行った唯一の他のことは、ビューを動的に表示するための柔軟な「ワークスペース」のアイデアを CAB から借りたことです。ただし、独自の Workspace インターフェイスを作成し、アプリで使用するために独自の DeckWorkspace と TableWorkspace を実装しました (これらは非常に簡単に作成できました)。

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

于 2009-02-04T17:39:21.173 に答える
1

何かを設計する前に、アプリの要件を定義する必要があります。
これは、初心者の開発者によくある間違いです。つまり、コードがどのように機能するかを考える前にコードを書き始めます。私のアドバイスは、あなたのアプリケーションのいくつかの機能を説明しようとすることです. それがどのように実装されるべきかを感じるのに役立ちます。

CompositeWPFは、デスクトップ アプリ開発のベスト プラクティスを開発者に教えるために特別に設計されたプロジェクトです。

于 2008-09-05T12:55:05.243 に答える
0

はい、小さなアプリケーション向けに簡単に構成できます。始めるには学習曲線がありますが、正直なところ、ゼロから始めようとするよりも WPF をよりよく理解するのに役立ちました。CompositeWPF を使用してプロジェクトを開始し、それを使用せずに別のプロジェクトを開始した後、CompositeWPF の機能を自分で複製しようとしていることに気付きました。:)

于 2008-09-05T14:28:41.477 に答える