詳細については触れませんが、いくつかのクライアント アプリケーションで使用されるサービス ベースのソリューションを設計しようとしています。このソリューションにより、管理者は、通常のユーザーがデータ入力を実行するために使用するドキュメント テンプレートを作成および変更できます。アプリケーションをベスト プラクティスやテクニックなどの学習ツールにすることが私の意図です。
同時に、私は統合失調症の環境に適応しなければなりません。なぜなら、「権力者」はテクノロジーやツールに関する決定に固執することができないからです。たとえば、私は今日、Linq-to-SQL を使用しています。なぜなら、それらは EF4 に移行する準備ができていないためですが、NHibernate への切り替えについての議論もあります。したがって、OR/M ツールを変更した場合に必要な作業を最小限に抑えるために、コードを可能な限り永続的に無視する必要があります。
この時点では、部分クラス アプローチを使用して Linq-to-SQL クラスを拡張し、ビジネス レイヤーで定義されたインターフェイスを実装することにも制限されています。経営陣はすべての組み込みツールなどを活用することを主張しているため、POCO を使用することはできません。そのため、Linq-to-SQL デザイナーをサポートする必要があります。
とはいえ、私のサービス インターフェイスには、シグネチャでテンプレート識別子を受け入れる StartSession メソッドがあります。操作の流れは次のとおりです。
- 現在のユーザーと指定されたテンプレートのセッションがデータベースに既に存在する場合は、レコードを更新して現在のアクティビティを表示します。そうでない場合は、新しいセッション オブジェクトを作成します。
- セッションはテンプレートのインスタンスに関連付けられており、それを「フォーム」と呼びます。したがって、セッションが新しい場合は、テンプレート情報を取得して新しい「フォーム」を作成し、それをセッションに関連付けてから、セッションをデータベースに保存する必要があります。一方、セッションが既に存在する場合は、ユーザーが入力し、以前にセッションに保存したデータを含む「フォーム」もロードする必要があります。
- 最後に、セッション (フォーム定義とデータを含む) が呼び出し元に返されます。
私の最初の目的は、アプリケーションの論理レイヤーを明確に分離することです。2 つ目は、持続性の無視を維持することです (前述のとおり)。第三に、すべてをテストできる必要があるため、簡単にモックできるようにすべての依存関係を外部化する必要があります。この分野で役立つ IoC ツールとして Unity を使用しています。
これを実現するために、サービス インターフェイスをサポートするために、必要に応じてサービス クラスとデータ コントラクトを定義しました。サービス クラスには、実際に作業を実行するビジネス層から注入された依存関係があります。そして、ここが私にとって厄介になったところです。
私は、永続性の無知を助けるために、作業単位とリポジトリのルートに行こうとしました。IUnitOfWork 実装からアクセスできる ITemplateRepository と ISessionRepository があります。サービス クラスは、SessionManager クラス (BLL 内) のインスタンスを挿入します。SessionManager は、コンストラクター インジェクションによって IUnitOfWork の実装を受け取り、すべての永続性を UoW に委任しますが、さまざまなロジックでシェル ゲームをプレイしていることに気づきました。
上記のすべてのロジックは、SessionManager クラスまたは UoW 実装に含まれている必要がありますか? データ アクセス プラットフォームを変更すると、アプリケーション ロジックに不要な変更が加えられる可能性があるため、リポジトリ実装のロジックはできるだけ少なくしたいと考えています。私のリポジトリはインターフェイスに対して機能しているため、新しいセッションを作成するにはどうすればよいですか (有効なセッションには、使用されているテンプレートへの参照があることに注意してください)。デザイナーをサポートし、リポジトリ実装内で AutoMapper のようなツールを使用してオブジェクトの翻訳を処理する必要がありますが、POCO を引き続き使用する方がよいでしょうか?
うーん!
私は分析麻痺で立ち往生していることを知っているので、おそらく少しのナッジが必要なのです. 理想的なのは、私が定義したビジネス ルールとアーキテクチャ上の制約が与えられた場合に、問題をどのように解決するかの例を誰かが提供できる場合です。