C# 3.0 でデスクトップ アプリケーションをどのように設計しますか

StackOverflow https://stackoverflow.com/questions/45705

  •  09-06-2019
  •  | 
  •  

質問

C#、wpf、.Net 3.5 を学ぶために、C# 3.0 で簡単なデスクトップ アプリケーションを作成しました。私のアプリケーションは基本的に、csv ファイルからデータを読み取り、SQL サーバー CE データベースに保存します。sqlmetal を使用してデータベースの ORM コードを生成します。このアプリの最初のイテレーションはとんでもなく醜いので、現在リファクタリング中です。

そこで私の質問が始まります。C# でデスクトップ データベース アプリを構築するにはどうすればよいでしょうか?ベストプラクティスは何ですか?

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

DAL パターンを使用する場合、シングルトンにするか静的メンバーにするか?View-Model-ModelView パターンを DAL パターンとともに使用しますか?

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

役に立ちましたか?

解決

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

DotNetRocks スタッフ ちょうどインタビューを受けました グレン・ブロック そして ブライアン・ノイズ 彼らからさらに詳しく聞きたい場合は、これについてお問い合わせください。

さらに良いことに、WinForms 時代の CAB に少しでも慣れているのであれば、Prism は CAB ほど重くないのです。

他のヒント

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

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

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

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

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

役立つ学習リソースについては、ぜひご覧になることをお勧めします。 複合WPF これは、開発者にデスクトップ アプリ開発のベスト プラクティスを教えるために特別に設計されたプロジェクトです。

ジェレミー・ミラーから始めたいと思います 独自のタクシーを構築する シリーズ。

私は初期の CAB アダプターでした。そのテクノロジを詳しく調べ、アプリケーション アーキテクチャに関する .NET ブログをすべて読むことで、多くのことを学びました。

しかし最近、新しいプロジェクトを開始する機会があり、CAB を使用する代わりに StructureMap と NHibernate を使用し、Jeremy が使用しているパターンの一部 (特に、イベント集約の処理方法) を借用しました。その結果、必要なことはすべて実行できる、非常に簡素化された手動ツールのフレームワークが完成しました。私はそれを使って作業するのが大好きです。

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

リポジトリを利用するサービス層 (WCF、二重チャネル経由で公開) があります。私のアプリは基本的にクライアント/サーバーであり、リアルタイムで更新されます (質問がクライアントに関するものであることは承知していますが、同じテクノロジーとパターンを使用します)。○

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top