MVC(3 RC2)アプリケーションで最高に達する一連のASP.NET 4プロジェクトがあります。このソリューションは、クロスカット依存性注入と検証にUnityとEntLib Validationを使用しています。両方とも、リポジトリとサービス層の実装を注入するのに最適です。entlib(またはDataAnnotations)、MVC、およびリポジトリパターンを使用して重複キー検証を実行する方法
しかし、重複したキーの検証方法を理解できません。たとえば、ユーザーが登録するときに、他のユーザーが既に使用しているユーザーIDを選択しないようにしたいとします。このタイプの検証では、検証オブジェクトにはリポジトリ参照...またはIQueryable/IEnumerable参照を取得して、すでにDBにある他の行をチェックする必要があります。
私が持っているのは、すべての適切なDataAnnotations属性とEntLib検証属性とともに、ユーザーのすべてのプロパティーセッターとゲッターを持つUserMetadataクラスです。 EF4 POCO Entity Generatorテンプレートを使用して実装されたUserEntityクラスもあります。 UserEntityはMetadataTypeAttributeを持つため、UserMetadataに依存します。同じ正確なMetadataType属性を持つUserViewModelクラスもあります。このようにして、属性を使用してエンティティとビューモデルの両方に同じ検証規則を適用できます。
リポジトリクラスへの具体的な参照はまったくありません。すべてのリポジトリはUnityを使用して注入されます。依存関係注入を取得するサービス層もあります。 MVCプロジェクトでは、サービスレイヤインプリメンテーションクラスがコントローラクラスに挿入されます(コントローラクラスにはサービスレイヤインターフェイス参照のみが含まれます)。 Unityは、リポジトリの実装をサービスレイヤクラスに挿入します(サービスクラスもインターフェイス参照のみを含みます)。
私は、メタデータクラスのDataAnnotations CustomValidationAttributeを試しました。これの問題は、検証メソッドが静的でなければならず、メソッドがリポジトリ実装を直接インスタンス化できないことです。私のリポジトリインターフェイスはIRepository <T>であり、すべてのドメインオブジェクトに対してEntityRepository <T>という1つのリポジトリ実装クラスしかありません。リポジトリを明示的にインスタンス化するには、新しいEntityRepository <UserEntity>()が必要です。これにより、循環依存グラフが生成されます:UserMetadata [依存] DuplicateUserIDValidator [依存] UserEntity [依存] UserMetadata。
カスタムの検証属性とともに、カスタムEntLibバリデーター<T>を作成しようとしました。ここで私は静的メソッドで同じ問題はありません。 UnityがEntityRepositoryをバリデータクラスに挿入する方法を見つけたら、これを動作させることができると思います。私はできません。今では、すべての検証コードが自分のメタデータクラスライブラリにあります。なぜなら、それがカスタム検証属性が行く場所なのでです。
現在のリポジトリの状態を確認する必要がある検証を実行する方法に関するアイデアはありますか?下層のクラスライブラリに依存関係を挿入するためにUnityを使用することはできますか?
は、この記事を見てみましょう。 – Steven