データベースに保存する前に、ドメイン エンティティ プロパティが一意であることを確認する必要があるシナリオがあります。これは単純なProductクラスです。新しい Product を作成するときに、 ProductKey 文字列プロパティが一意であることを検証したいとします。
public class Product : EntityBase
{
int ID { get; set; }
string ProductKey { get; set; }
int CategoryID { get; set; }
bool IsValid
{
get
{
if (string.IsNullOrEmpty(ProductKey))
{
ValidationErrors.Add("ProductKey Required.");
}
if (CategoryID == 0)
{
ValidationErrors.Add("CategoryID Required.");
}
/* Validation that the product key is unique could go here? i.e. requires a database read. */
return ValidationErrors.Count() == 0;
}
}
}
私はドメイン駆動設計を使用しているため、製品エンティティには永続性やサービス層に関する知識がありません。次のように Service メソッドにチェックを追加するだけです。
public class ProductService
{
private IProductRepository _productRepository = new ProductRepository();
public int CreateProduct(Product item)
{
if (item.IsValid)
{
if (ProductKeyIsUnique(item.ProductKey))
{
_productRepository.Add(item);
}
else
{
throw new DuplicateProductKeyException();
}
}
}
private bool ProductKeyIsUnique(string productKey)
{
return _productRepository.GetByKey(productKey) == null;
}
}
これは非常に単純ですが、理想的には、そのようなロジックをドメイン モデルに含めたいと考えています。おそらく、サービス層でキャッチできる何らかの検証イベントを発生させることでしょうか?
このタイプのシナリオのベスト プラクティスまたは既知の設計パターンはありますか?