1つの戦略は、制約を検証できるサービスを実装することです。
public interface IWebsiteUniquenessValidator
{
bool IsWebsiteUnique(string websiteUrl);
}
あなたは、あなたはそれが私にはわからないが、私はドメインを介して行くことについて心配することはないことをお勧めの要因に依存するどのように行う、それを実装する必要があります。シンプルにしましょう。ちょうどクエリです(* - これを下部に追加します)。
public class WebsiteUniquenessValidator : IWebsiteUniquenessValidator
{
//.....
}
次に、それが必要な方法に「注入」します。私はドメインの外部からドメインオブジェクトに提供するので、 "注入"と言うが、コンストラクタパラメータではなくメソッドパラメータで行う(私たちのエンティティをIoCコンテナによってインスタンス化する必要を避けるため) )。それは、サービスクラスまたはCommandHandlerだ場合 - - そのユニークさバリデータ依存性を提供することができ、あなたのユーザーとそのリポジトリの消費者が何であれ
public class User
{
public void AddWebsite(string websiteUrl, IWebsiteUniquenessValidator uniquenessValidator)
{
if (!uniquenessValidator.IsWebsiteUnique(websiteUrl) {
throw new ValidationException(...);
}
//....
}
}
。それはUserRepositoryを消費しますので、この消費者はすでにによって、IoCの通って上に配線する必要があります
public class UserService
{
private readonly IUserRepository _repo;
private readonly IWebsiteUniquenessValidator _validator;
public UserService(IUserRepository repo, IWebsiteUniquenessValidator validator)
{
_repo = repo;
_validator = validator;
}
public Result AddWebsiteToUser(Guid userId, string websiteUrl)
{
try {
var user = _repo.Get(userId);
user.AddWebsite(websiteUrl, _validator);
}
catch (AggregateNotFoundException ex) {
//....
}
catch (ValidationException ex) {
//....
}
}
}
*私は検証を簡単に作るとドメインを避け述べました。
ドメインを構築して、データの変更に伴う複雑な動作をカプセル化します。
これは、データの変更に関する要件がデータのクエリに関する要件と大きく異なることを示しています。
これは、書き込みシステムを強制的に読み込みしようとしているため、これは苦労しているようです。
これらの痛みを緩和するために、書き込み側からドメインからのデータの読み取りを分離することは可能です。
CQRSは、この手法に与えられた名前です。私はCQRSの文脈でDDDを見たら、電球の束が一度クリックされたと言うでしょう。 CQRSの概念を理解しようとすることを強くお勧めします。
はい、ただし、特定のURLを持つWebサイトに関連付けられたユーザーを検索するには、Webサイトがユーザーなしで存在しない場合(1対多) – ebb
@ebb、私はちょうど 'u.UserIdUserIdからw.UserId = u.UserId w.Url = @ url'を選択するだけです(しかし、あなたのリポジトリのイディオムを仲介します基準を指定する)。 –
@Jeff Sternal、あなたは私が間違っていると思う。同じURLの新しいWebサイトを追加してそれをユーザーに関連付ける前に、データベースのANYユーザーに同じURLのWebサイトレコードが関連付けられているかどうかをチェックしたいと思います。 – ebb