2017-11-03 3 views
2

ここに問題があります: 私たちは、ユーザーがミッションと対話するプロジェクトを持っています。しかし、すべての任務はキャンペーンの一部であり、すべてのキャンペーンはアカウントに存在します。私にとっては、アカウントを集約的なルートにすることは理にかなっているようです(なぜなら、ミッションはキャンペーンなしでは存在できず、アカウントなしではキャンペーンが存在できないからです)。論理とパフォーマンスの根本的な矛盾

アカウント、キャンペーン、およびミッションには、ミッションがユーザーによって実行されるために必要な予算があります。 だから私はこのような何か考えた:ドメインロジックのために意味をなす

class Account{ 
    Budget Budget; 
    List<Campaign> Campaigns; 
    // Account stuff 
} 

class Campaign{ 
    Budget Budget; 
    List<Mission> Missions; 
    // Campaign stuff 
} 

class Mission{ 
    Budget Budget; 
    double Value; 
    // Mission stuff 
} 

を、しかし、私は彼らがキャンペーンやアカウントを気にしないので、ユーザーは、ミッションを直接操作できるようにトラブルを抱えています。また、複数のアカウントがあり、実行できるすべてのミッションをユーザーに提供する必要があります。すべてのこれらのエンティティをロードすると重くて複雑になりますので、私はすべてを元に戻すと、このような使命を作りについて考えた:

class Mission{ 
    Budget AccountBudget; 
    Budget CampaignBudget 
    Budget MissionBudget 
    Double Value; 
    // All mixed stuff that i need 
} 

だから私はちょうどミッションリポジトリがあるでしょうし、それはすべてのミッションやユーザーと作業しやすくなり、ミッションが実行されると、私はすべてのミッションのアカウントとキャンペーンの予算を更新する必要があります。この構造はまた、ドメインロジックに関して私にはあまり意味がありません。 私は最初の解決策をとると、どのようにパフォーマンスの問題を回避し、利用可能なすべてのミッションをユーザーが利用できるようにするのですか?そして、私が第2の解決策をとるなら、それは意味をなさないでしょうか?

+0

適切な人々が見つけるために使用するプログラミング言語で質問にタグを付けてください。 –

答えて

0

私はアカウントを集約ルートにすることが論理的です(キャンペーンなしでミッションは存在できず、アカウントなしではキャンペーンが存在できないため)。

実際には、それは特に優れたヒューリスティックではないようです。ドメインを集合体に刻むことは、構造体よりものほうが、の動作になります。ミッションを変更するには、アカウントの詳細を知る必要がありますか?アカウントを変更するためのミッションの詳細を知る必要がありますか?

私は、キャンペーンやアカウントを気にしないため、ユーザーがミッションを使って直接作業できるようにするのに問題があります。

これは、ミッションがおそらく別の集約であるという大きなヒントです。これは、多くのユーザーが互いのつま先で足を踏み入れずに同時にミッションを操作することを期待する場合に特に当てはまります。

ミッションが実行されると、すべてのミッションのアカウントとキャンペーンの予算を更新する必要があります。

はい、しかし、その必要性はすぐ、またはすぐにだけを発生するのでしょうか?

おそらく、warehouse systemsのGreg Youngのトークを検討する必要があります。基本的な考え方は、ドメインモデルがユーザーの作業を妨害しようとしなかったことです。そのモデルが問題があると思われる場合は、「例外レポート」を作成することに重点を置いていました。非同期は、ミッションの予算への変更を観察し、必要に応じて、キャンペーンやアカウントの予算を更新し、集約という別のとミッション予算と直接作業し、ユーザー、次のようになりますあなたの例では

、。

同じ基本的な考え方の別のビューには、タイミングのマイクロ秒の差がコアビジネスの行動に違いを作るべきではありませんRace Conditions Don't Exist

のUdi漢のエッセイです。

ミッション予算を更新するユーザーが多数います。これは、が協力してとアカウントの予算と相互作用していることを示しています。だからあなたは、ユーザーの競合なしにこのコラボレーションが起こることを可能にするデザインについて考えるべきです。

私の推測では、あなたが最終的に見て、あなたが共有リソース上のユーザーとのコラボレーションを可能にするために、デザインについてどんな提案を持っていますか

class Mission{ 
    AccountId accountId; 
    CampaignId campaignId; 
    MissionId missionId; 

    Budget Budget; 
    // Mission stuff 
} 

ようMission構造を自分で見つけるつもりか、いくつかのソースされていることですアップ?

私はそこにたくさんのものがあるとは思わない。あなたは、グレッグ・ヤングの話からいくつかのアイデアをoccasionally connected systemsに得ることができるかもしれません。

外部からのメッセージをコマンドとして扱う代わりに、他の結果はエスカレートするかもしれない

Alice said X 
Bob said !X (contradicting Alice) 
... and therefore (other consequences) 

外の世界は、レコードの本ですので.... UserDecidedUserSubmittedForm、および下流のイベントプロセッサのようなあなたの集計行為:あなたは彼らがイベントであると考えることができます人間と人間との間でやりとりをしたり、2つの決定が互いに打ち消し合ったりする...

あなたの記録はまだ更新されているので、CQSの意味では「handle(Event)」の「コマンド」ですが、 「イベントをキャプチャする」と「イベントに対処する」を切り離すことができます

+0

アカウントごとに最大予算があるというルールがある場合はどうなりますか? 'mission.allocateNewBudget(budget)'が 'BudgetAllocationRequested'を発生させ、' BudgetAllocatedToMission'で拒否または受け入れる 'mission.allocateBudgetToMission'を呼び出すProcess Managerを使用し、 mission.approveBudgetAllocation(budget) 'を実行します。すぐに割り当てを許可し、違反を検出できると思いますか? – plalx

+0

あなたの答えをありがとう、私はあなたが提供したリンクを見て、それは正しい方向を取るようです。共有リソースやいくつかのソースを参照して、ユーザーのコラボレーションを可能にする設計に関する提案はありますか? – DuskMcDusk