問題タブ [unit-of-work]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - UnitOfWork の実装
エンティティ フレームワークを操作するためのちょっとクールな作業単位を実装できました。
私が思いついた..
今では誰もがこの作業単位に嫉妬していると確信しています。(冗談)
しかし、このサービス層には少し設計上の問題があります。
問題は、作業単位がデータベース インジェクションを必要とするため、そのインスタンスを作成できないことです。作業単位は使い捨てである必要があるため、意味がないため、サービス層で直接作業単位を提供することはできません。
また、リポジトリを使用して自分のものを追加するため、作業単位に直接アクセスする必要はありません。とにかく破棄されると、保存が自動的に行われます。
サービス層に IDatabaseFactory を挿入することはできますが、そこでは使用しないという考えです。実際、サービス層はそれについて知っているべきではありません。
UnitOfWork ファクトリーはどうですか?
これを修正する方法についてのアイデアや提案はありますか?
ありがとう。
linq-to-sql - LINQ to SQL は単一の作業単位のみをサポートしていますか、それともコンテキストを保持して次の操作を実行できますか?
私はWindowsアプリケーションを持っています。DataContext を介してレコードを挿入しようとしています。テーブル内に一意の識別子があります。私も挿入後にトリガーを実行しています。そのため、トリガーの最後に選択クエリを作成して、自動ジェネレーター番号を取得し、自動同期エラーを回避しています。Windowsアプリケーションなので、コンテキストを長期間保持できます。新しいオブジェクト (注文など) を作成し、以前と同じ操作を行うと、SubmitChanges 操作で、キーを重複させることはできません。この同じコンテキストを使用して 2 番目のレコードを挿入できないのはなぜですか? それとも、新しいレコードを挿入するために新しいコンテキストを作成する必要がありますか?(この作業単位の概念はここに含まれますか?)。すべてのデータを再度ロードする必要があるため、新しいコンテキストを作成することはお勧めできません..
何か考えはありますか?
私の状況を説明するためのコードサンプル:
このような設定がたくさん...
上で述べたように、これは Windows フォームの [チケットを開く] ボタンをクリックすることです。fname、lname、およびそのフォームで使用可能なテキストボックス内のすべての値を変更し、同じボタンをクリックしました。したがって、同じメソッドが再度呼び出されます。以下の指定されたエラーが表示されます。
System.Data.Linq.DuplicateKeyException: 既に使用されているキーを持つエンティティを追加できません。
design-patterns - コントローラとサービスの間にファサードサービスを実装するのは良い考えですか?
操作とアプリケーションロジックを実行するために、各サービスクラスメソッドに作業単位を使用しているシナリオ。コントローラとサービスの間にファサードサービスを実装することをお勧めしますか?アイデアは、複数の作業単位を使用せずに、1つのトランザクションで多くのサービスを使用できるようにすることでした。
ありがとう。
unit-of-work - 作業単位はどこで使用すればよいですか?なぜ?
作業単位をどこで使用すればよいか知りたいですか?なぜ ?
- リポジトリレベル?しかし、2つのリポジトリが必要な場合はどうでしょうか。
- サービスレベル?しかし、他のサービス方法を再利用する必要がある場合はどうでしょうか。
- コントローラーレベル?しかし、コントローラーにロジックを配置したくない場合はどうでしょうか。
その最もよく見られ、使用されるべき場所を知りたいです。私は次のような実装を使用しています:
(私はエンティティフレームワークでASP.NET MVC 3を使用しています)
ありがとう。
linq - System.Data.Linq.DuplicateKeyException: 既に使用されているキーを持つエンティティを追加することはできません
私のはWindowsアプリケーションです。LINQ DataContext を介してレコードを挿入しようとしています。テーブル内に一意の識別子があります。私も挿入後にトリガーを実行しています。そのため、トリガーの最後に選択クエリを作成して、自動ジェネレーター番号を取得し、自動同期エラーを回避しています。Windowsアプリケーションなので、コンテキストを長期間保持できます。新しいオブジェクト (注文など) を作成し、以前と同じ操作を行うと、SubmitChanges 操作で、キーを重複させることはできません。この同じコンテキストを使用して 2 番目のレコードを挿入することはできませんか? それとも、新しいレコードを挿入するために新しいコンテキストを作成する必要がありますか?(この作業単位の概念はここに含まれますか?)。すべてのデータを再度ロードする必要があるため、新しいコンテキストを作成することはお勧めできません..
何か考えはありますか?
私の状況を表現するために、いくつかのコードサンプルを入れてみましょう。
このような設定がたくさん...
上で述べたように、これは Windows フォームの [チケットを開く] ボタンをクリックすることです。fname、lname、およびそのフォームで使用可能なテキストボックス内のすべての値を変更し、同じボタンをクリックしました。したがって、同じメソッドが再度呼び出されます。以下に指定されたエラーが発生します。System.Data.Linq.DuplicateKeyException: 既に使用されているキーを持つエンティティを追加できません。
ありがとう。
.net - 作業単位パターン
作業単位パターンに関するアドバイスを探しています。
作業単位のコミットが複数回呼び出されたのか、それとも 1 回だけ呼び出された後、ガベージ コレクションのためにオブジェクトを残したのか?
作業単位プレイを注入するのは良い考えですか、それともオブジェクトに作業を実行するように依頼するときにメソッド呼び出しで渡す必要がありますか?
transactions - DB2 でセーブポイントがなくてもロールバックは機能しますか?
この質問はこれに部分的に関連しています
次の SQL を使用すると、トランザクションがロールバックされない理由:
DB2/iSeries のドキュメントから知っているように:
ROLLBACK ステートメントは、作業単位を終了し、その作業単位によって行われたデータベースの変更をバックアウトするために使用されます。
作業単位が開始または終了したことを示す指標は何ですか? 上記の例では何がロールバックされますか?
すべての回答とリンクに感謝します。
PS。DB2/iSeries V5R4 を使用しています。
PPS。下手な英語でごめんなさい
java - 追加のリクエストをキューに入れずにタスクをシングル スレッド化する
タスクが完了するまでそれ以上のリクエストを破棄しながら、タスクを非同期で実行する必要があります。
メソッドを同期すると、タスクがキューに入れられるだけで、スキップされません。最初は SingleThreadExecutor を使用することを考えていましたが、それもタスクをキューに入れます。次に ThreadPoolExecutor を調べましたが、キューを読み取って実行するタスクを取得するため、1 つのタスクが実行され、少なくとも 1 つのタスクがキューに入れられます (その他は ThreadPoolExecutor.DiscardPolicy を使用して破棄できます)。
私が考えることができる唯一のことは、セマフォを使用してキューをブロックすることです。私が達成しようとしていることを示すために、次の例を用意しました。もっと簡単な方法はありますか?明らかな何かを見逃しましたか?
サンプル出力
axtavt の回答を取得し、上記の例を変換すると、次のより簡単なソリューションが得られます。
c# - 作業単位、ロールバック オプション
永続性の無視/単体テストなどを可能にするために、リポジトリと作業単位のパターンに従うシステムを構築しようとしています。ロールバックの処理に関するアドバイスを探しています。理想的には POCO を使用したいのですが、いくつかの断片を提供するために、少なくともインターフェイスを実装する必要があると思います。
したがって、1 つのコンテキスト/作業単位である 2 つのリポジトリがあるとします。
1 つの項目を追加し、別の項目を修正し、3 つ目の項目を削除します。2 番目のリポジトリについて繰り返してから、ロールバックを呼び出します。
過去に、これには DataSet に似たものを使用しました。各オブジェクトには、pendingNew、pendingAmended、pendingDeleted、clean の状態があります。ロールバック用のオブジェクトの最後に保持されたバージョンのコピーもあります。
これをどのように実装しますか?
編集:
わかりました、これが私が実際に頭を悩ませようとしていると思うことです。パターン化する準備をしてください:)
最終的にプロジェクトは WPF MVVM です。そのため、ここにある店舗のモデルを調べています。
モデルが提供する必要がある機能を提供するために、モデルは UOW とリポジトリを使用する必要があると思いますが、モデルをリポジトリのアイデアと混同しようとしてきたと思います。その方がいいですか?
完全な永続性を無視したいので、ドメインに Customer、Order、および OrderLines が含まれていると想像してください。
GUI には、ユーザーが顧客の詳細、注文の詳細、および 1-n OrderLine の詳細を入力できる 1 つのボタンの新しい注文があるとしましょう。彼は保存を押してデータベースに移動しますが、キャンセルを押してもデータベースに移動しません。
したがって、この場合、モデルは CustomerRepository に顧客を要求し、次に OrderRepository に新しい Order を要求し、次に OrderLineRepository に新しい各 Line を要求し、Unit of Work にそれらを保存するように指示します。
それは合理的に聞こえますか?それは私にはそうです、私はそれが分離が定義される場所だと思います。モデルとリポジトリの間に別の API を用意したいと思っています。いいえ、それはばかげています。
編集 2: これは、少し役に立った優れた記事です。
nhibernate - 複数のViewModelが同じドメインオブジェクトを変更します
私の英語でごめんなさい。
以前、この質問を次のように投稿しました。複数のViewModelが同じドメインオブジェクトを要求します。同じ/異なるインスタンスを指定する必要がありますか?
これについて調査したところ、前の質問がわかりにくいことに気づいたので、この新しい質問を投稿します。
10億人の情報を管理するWPFデスクトップアプリケーションを構築したいとします。エンドユーザー(me)は1人だけで、すべてのデータはローカルマシン(SQL Server / MySQL)に保存されます。Visual Studio、Autofac、NHibernateを使用して、MVVM、DI、DDDパターンを実装してみます。
同じ人物をUIのどこにでも同時に表示できます:複数のウィンドウ、タブ、リスト、コンボボックス、テキストブロック...各リストには数千人の人物を含めることができ、アプリケーション全体には10〜100のリストを含めることができます。また、リストの内容(人)は頻繁に更新されます。リストの設定を変更するたびに、リストは空になり、さらに数千人の新しい人でいっぱいになります。
問題は次のとおりです。1つのリストで人を変更した場合(名前の変更など)、他のすべてのリストに変更を適用するにはどうすればよいですか?
この問題を解決するには2つの方法があると思います。
各人に対して、アプリケーション全体で単一のインスタンスを使用します。これを実装するには、アプリケーションを介して単一のUnitOfWorkを使用できますが、このアプローチではメモリリークが発生するようです。
各人に複数のインスタンスを使用します(リストごとに1つのインスタンス)。これを実装するには、リストごとに1つのUnitOfWorkを使用する必要があり、人のすべてのインスタンスを同期する方法を見つける必要があると思います。ベリルはイベントアグリゲーターについて言及しました。しかし、誰がイベントを公開して登録する責任がありますか?
私はここで非常によく似た質問を見つけ、次の記事も読みましたが、それでも混乱を感じています。
ありがとう!