1

データベースに保存する前に、ドメイン エンティティ プロパティが一意であることを確認する必要があるシナリオがあります。これは単純な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;
    }

}

これは非常に単純ですが、理想的には、そのようなロジックをドメイン モデルに含めたいと考えています。おそらく、サービス層でキャッチできる何らかの検証イベントを発生させることでしょうか?

このタイプのシナリオのベスト プラクティスまたは既知の設計パターンはありますか?

4

2 に答える 2

5

プロダクト キーの一意性は、ドメイン オブジェクトの知識ではありません。したがって、ドメインの検証は必要ありません。製品がキーの一意性を気にする必要があるのはなぜですか? 私の意見では、それはアプリケーション層の責任です。あなたの解決策は私にとって有効で正しいようです。

于 2012-12-17T15:14:03.897 に答える
1

シリアライズ可能な分離レベルを使用しない限り、ソリューションは同時トランザクションに対して安全ではありません。もっとシンプルなソリューションを使用したいです。これを行う一般的な方法は、データベースで一意の制約を使用することです。ドメインでこれをモデル化しようとすると、不要な複雑さが生じるだけです。

于 2012-12-18T08:52:42.427 に答える