0

私のアプリケーションには次のものがあります: アクション Orm エンティティ (テレリック オープン アクセスから) リポジトリ (アクションの) AppService (リポジトリのインスタンスを保持)

インスタンスを保存する必要がある場合は、インスタンスを AppService に送信します。次に、AppService はバリデーターを呼び出して、保存するインスタンスを検証します。バリデーターはhttp://codeinsanity.com/archive/2008/12/02/a-framework-for-validation-and-business-rules.aspxに基づいています (完全なコードはhttps://github.com/riteshrao/にあります)共通

したがって、基本的に AppService の保存機能は次のようになります

Public Sub AddAction(ByVal Item As Data.Model.Action)
        Contract.Requires(Of ArgumentNullException)(Item IsNot Nothing, "Item is nothing.")

        Dim validateResult As Rules.ValidationResult = _ActionValidator.Validate(Item)
        If Not validateResult.IsValid Then
            Throw New Validation.ValidationException(validateResult)
        End If

        Try
            _ActionRepository.Add(Item)
            _unitOfWork.SaveChanges()
        Catch ex As Exception
            _unitOfWork.ClearChanges()
            Throw New DataServiceException(ex.Message, ex)
        End Try

    End Sub

アクション アイテムのプロパティを確認するには、サンプル コードがうまく機能します。私の質問は、同じ顧客に対して同じアクションが DB に 2 回追加されないようにする必要があるときに始まります (つまり、ID が異なり、名前が同じで、顧客が同じです)。

私が見ているように、いくつかのオプションがあります: オプション1:次のようなものを使用して重複アクションを確認します

function(validatedItem) item.Customer.Actions.Any(function(item)  item.id<>validatedItem.id andalso item.name=validatedItem.name))

基本的に、保存されているアクションから顧客に戻り、すべてのアクションに戻り、別の ID と同じ名前のアクションが存在するかどうかを確認します

欠点は次のとおりです。

を。これが機能するために、アイテムの顧客プロパティにアクセスするときに、顧客オブジェクト全体が DB から読み取られますが、この場合は冗長です b. Any 関数はクライアントで item.Customer.Actions として評価され、IList(Of Action) を返します。

オプション 2 : 検証クラスがアクション リポジトリにアクセスできるようにします。それから私は単に次のようなことをすることができました

'assume I already have validatedItem
repository.Any(function(item) item.id<>validatedItem.id and item.customerid=validatedItem.customerid and item.name=validatedItem.name)

これにより、Exists クエリが DB に送信されますが、欠点 (?) は、検証フレームワークがリポジトリに直接アクセスしてはならないことです (検証と ORM を使用していることがわかる非常に少数の例で見た限りでは)。 )

オプション 3 : 検証クラスが AppService にアクセスできるようにし、AppService を使用して重複の存在を確認します。問題: 循環参照を作成します (AppService->Validation Class->AppService) b. 検証にのみ関連する基準に基づいてアイテムをロードするために、AppService で多くの役に立たない関数を作成する必要があります

ここで最高のコースは何ですか?

4

1 に答える 1

2

最も簡単な方法は、ドメインからデータベース内の重複をチェックしないことです。

エンティティのコレクションが集計の一部である場合、重複をコレクションに追加することを許可しないため、問題はありません。集計は全体として保存されるため、問題が発生することはありません。

たとえば、電子メール アドレスの重複を望まず、集計によってエンティティのコレクションが表されないシナリオ (Usersシステム内の など) では、データベースに一意性を適用させることができます。例外をピックアップして報告するだけです。多くの場合、データベース システムに必要なロックが実装されていない/実装されていないという理由だけで、検証で一意性を強制することはできません。

だから私はそれをデータベースに任せるだけです。

于 2013-04-04T05:14:00.817 に答える