これは、作成しているアプリケーションの種類によって異なります。たとえば、バグは受け付けますか?あなたのデータ要件は何ですか?ソフトリアルタイムですか?酸?最終的に一貫性があり、かつ/または部分的に接続された/時折切断されたクライアント?
同時性と非同期性の区別があることに注意してください。 asynchronocityを持つことができ、実際に同時に実行しているプログラムを実際に持たずにメソッド呼び出しインタリーブを呼び出すことができます。
1つのアイデアは、書き込み側が変更されたときにイベントをパブリッシュするアプリケーションの読み取り側と書き込み側を持つことです。これはイベント駆動型システムにつながる可能性があります。読書面は公開されたイベントから構築され、再構築することができます。 UIはタスク駆動型であるため、実行するタスクによってBLが取るコマンド(または必要に応じてドメインレイヤー)が生成されます。
あなたが上記を持っているなら、論理的な次のステップは、イベントソースとなることです。次に、以前にコミットされたものを通して、ライト・モデルの内部状態を再作成します。 CQRS/DDDに関するGoogleグループがあります。
UIの更新に関しては、System.Reactive、System.Interactive、System.CoreExのIObservableインターフェイスが適していることがわかりました。ディスパッチャ - スレッドプールなどのさまざまな並行呼び出しコンテキストをスキップして、タスク並列ライブラリとうまくやり取りします。
あなたはビジネスロジックをどこに置かなければならないかを考慮する必要があります。ドメイン駆動型の場合は、配布するバイナリの更新手順があるのでアプリケーションに入れることができますとにかく、時が来るとアップグレードするが、サーバーに置くという選択肢もある。コマンドは、接続指向のコードが失敗したとき(小さなものとシリアライズ可能で、それらの周りにUIを設計できる)、書き込み側と作業単位の更新を行ううえで便利です。 IObservable.ObserveOnDispatcher(...)に優先順位を追加
あなたの例を与えるために、このコードで、this threadを見て、 - 呼び出し:
public static IObservable<T> ObserveOnDispatcher<T>(this IObservable<T> observable, DispatcherPriority priority)
{
if (observable == null)
throw new NullReferenceException();
return observable.ObserveOn(Dispatcher.CurrentDispatcher, priority);
}
public static IObservable<T> ObserveOn<T>(this IObservable<T> observable, Dispatcher dispatcher, DispatcherPriority priority)
{
if (observable == null)
throw new NullReferenceException();
if (dispatcher == null)
throw new ArgumentNullException("dispatcher");
return Observable.CreateWithDisposable<T>(o =>
{
return observable.Subscribe(
obj => dispatcher.Invoke((Action)(() => o.OnNext(obj)), priority),
ex => dispatcher.Invoke((Action)(() => o.OnError(ex)), priority),
() => dispatcher.Invoke((Action)(() => o.OnCompleted()), priority));
});
}
を
上記の例を使用することができます{コスト:仮想スターバックスのお店で、たとえば、あなたがイベント「CustomerBoughtCappuccino」を生成「バリスタ」クラスのようなものを持っているドメインエンティティを持っていると思いますので、このようblog entryは...
public void LoadCustomers()
{
_customerService.GetCustomers()
.SubscribeOn(Scheduler.NewThread)
.ObserveOn(Scheduler.Dispatcher, DispatcherPriority.SystemIdle)
.Subscribe(Customers.Add);
}
について説明します。 '$ 3'、タイムスタンプ: '2011-01-03 12:00:03.334556 GMT + 0100 '、...など}あなたの読者は、これらのイベントを購読します。読み込み側は、データを表示する各画面のデータモデルになります。ビューには、観察可能な辞書like thisのビューと同期されるユニークなViewModelクラスがあります。リポジトリは(:IObservable)になり、プレゼンターはそのすべて、またはその一部にサブスクライブします。 - >ユーザの操作に焦点を当て
とBL駆動コマンド、非同期
はあなたBLのみを取ることを考えると
を読み書き偏析駆動
- タスク:あなたのGUIが可能であること方法コマンドを実行し、そのディスプレイの上に「すべてのページに適したタイプ」の読取りモデルではない場合は、内部、内部保護、および非公開のほとんどのものを作成できます。つまり、System.Contractsを使用して、それにバグはありません(!)。これは、あなたのリードモデルが読むイベントを生成します。降格された非同期タスク(IAsyncResults)のワークフローのオーケストレーションについては、Caliburn Microの主な原則を採用することができます。
あなたが読むことができるRx design guidelinesがあります。イベント調達とcqrsに関するcqrsinfo.com非同期プログラミング領域を超えて並行プログラミング領域に移行することに本当に関心があるならば、マイクロソフトはこのようなコードをプログラミングする方法について、無料でwritten bookをリリースしました。
希望します。
私はControl.Invoke()の動作を知っていますが、質問はデザインパターンとベストプラクティスについてです。どのコントロールをControl.Invoke()に使用しますか?フォームを使用するのがベストプラクティスですか?私はプレゼンターのフォームへの参照が必要であるか、フォームのコードビハインドからInvoke()を呼び出すのですか? –
@IIya:わかりました。状況によって異なりますが、通常はコントロールを更新するロジックを記述し、ターゲットコントロールを使用してInvokeRequiredをチェックし、次にcontrol.Invoke()をチェックします。私の編集を参照してください。 –