質問

これは、私はちょうど完全の概念grokkingていないよということ(でも可能性)が可能だ「作業単位を。」基本的に、私は、オブジェクト指向環境で使用される広範な取引の一種として、それを参照してください。仕事の単位、オブジェクトと対話、コミットやロールバックを開始します。しかし、どのように実際の取引に、このブレークダウンは、それらのオブジェクトの背後にあるデータストアにいますか?

単一DBと(例えばNHibernateのような)ORMを有するシステムにおいて、

は簡単です。トランザクションは、ORMを通じて維持することができます。しかし、どのようなカスタムドメインモデルは、多くの異なるデータソースを曖昧にしているシステムはどうですか?そして、すべてではないそれらのデータ・ソースのリレーショナルデータベースがありますか? (この辺りのファイルシステム上で行わたくさんあります。)

今、私はという考えにこだわって「あなたは、単にすべて同じ「原子のビジネスオペレーションにSQL2005 DB、SQL2000 DB、DB2 DB、ファイルシステム全体にトランザクションを維持することはできません。」今のように、それはコード内で手動でトランザクションを維持するために、(一般的に互いに独立して動作する)チームの開発者の責任です。各DBがそれに適切なトランザクションを持つことができますが、全体として事業運営を手動で確認し、道のすべての重要なステップをバランスされます。

しかし、ドメインおよび標準現像液のターンオーバーに複雑さを増すと、このアプローチは、時間にわたってますます難しく、エラーが発生しやすいとなります。

んと誰がどのようにドメインこのテースト最善では対処し、またはそれは前に対処されていますか?任意のアドバイスや例を持っていますかこの場合、実際の「ドメイン」とは、異種のレガシーアプリケーションの大規模なエコシステムを置き換える/ 1日にプロトタイプが展開するよう進化して、非常に多くのまだ始まったばかりであると消費します。だから、再設計と再ファクタリングの余地があります。

参考までに、私は現在を目指していますデザインの万フィートの図である:AS-ダム-AS-可能中央メッセージベースのサービスを呼び出すクライアントアプリケーション小型の大規模なコレクション。このサービスは、「ドメインコア」への玄関で、一つの大きなMVCスタイルのアプリケーションと考えることができます。要求は(多くの「コントローラー」のような)ハンドラによってピックアップされている(多くの「アクション」のような)サービスに作られています。手続き何かがそこに行きます。彼らはすべてのビジネスルールを含むモデル、と対話します。モデルは、リポジトリ(データベースX、データベースyを、ファイルシステム、電子メール、任意の外部リソース)と相互作用することにより、リスナー(「サービス」とは?この部分はまだ設計と改善の対象で濁っている)イベントピックアップし、ハンドルを公開します。すべての陽気に依存-注入さに応じています。

申し訳ありませんが、すべての冗長性のために:)しかし、誰もが何かアドバイスがあれば、私はそれを聞いてみたいです。そのアドバイスがある場合でも、(特に)、「デザインが悪い、これを試してみてください代わりに...」ありがとう!

役に立ちましたか?

解決

私は以前これを実現することができ、システムに働いて、それは非常に簡単です。あなたはその初期段階にあるプロジェクトので、おそらくこれはあなたのための有用な情報である可能性があります。残念ながら、私はもはやコードへのアクセスを持っていませんが、まだそれが働いたか説明するのに快適です。

私が行っていたことは、一般的なリポジトリパターンの実装を使用して、私のリポジトリを構築しました。ベースのリポジトリタイプは、常にサービスとUOWによる参照になります。議論のために、我々はそれをBaseRepository呼び出します。 「T」はドメインオブジェクトを表すIEntityの実装に制限されるだろう。 BaseRepositoryから、私は、このようななどSqlBaseRepository、XmlBaseRepository、として、合成のための基底クラスの別のセットを作成していた。

何かがコア機能が存在する場所であるタイプBaseRepository、であることを

UOWのみ心配。 (CRUDの)基本的なCUDは、作成、更新、削除のための同等物を提供し、表現されます。どのようなこれらのそれぞれが行うだろうと、デリゲートを作成しても、それはになるだろうし、適切なデータがそれを完了するために必要な取引の種類についての情報を渡して、UOW内のキューに配置するだろう。 UOWは、リポジトリは、トランザクションに関与することが必要になるだろうし、何のリストを維持し始めるだろうが、まだそれはだっ入力し気にしませんでした。 Effictively、ここまでキューイングのトランザクションに入隊ようなものです。

BaseRepository)が.ApplyChange(のようなものという抽象メソッドを定義しました。 .Commitたら()UOWに呼ばれていた、それは.ApplyChangeに情報を渡すバック、のTransactionScope()を作成し、リストの中delagatesを呼び出す開始します()。 .ApplyChangeの実際の実装は、()等の特定のリポジトリベース、即ちSqlRepositoryBaseに存在しても、実装によってオーバーライドすることができた。

それは、少なくとも私にとっては、トリッキーだ

は、ロールバックされました。私は、単一のデータベースのみを扱って、時には行われたファイルベースの変更を持っていました。私は基本的に私は、ファイルスタックにあった場所に戻って取得するために逆デルタを適用することができるように.RevertChange()メソッドと元の状態を追跡し始め、変更の状態を追加します。

私は、実装上の具体的ことができることを望むが、私は今のコードを見てきましたので、それが一年以上されています。私は元のコードの基礎が本から負担されたことを伝えることができ、 .NETドメイン単位ティム・マッカーシーによって、ソリューションの - デザイン - 問題:C#でデザインドリブン。私のリポジトリの実装は大量の私のカスタマイズの大多数がのUOWとその実装に入って来て、彼の例に基づいていた。

私は多少、役に立てば幸い! : - )

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