何らかのコンテキスト(NH の ISession、IRepository など) にアクセスする必要がある POCO オブジェクトに対して検証を実行する最善の方法について、何度も何度も考えています。
まだ確認できる唯一のオプションはService Locatorを使用することなので、検証は次のようになります。
public User : ICanValidate {
public User() {} // We need this constructor (so no context known)
public virtual string Username { get; set; }
public IEnumerable<ValidationError> Validate() {
if (ServiceLocator.GetService<IUserRepository>().FindUserByUsername(Username) != null)
yield return new ValidationError("Username", "User already exists.")
}
}
私はすでにInversion Of Control と Dependency Injectionを使用していますが、多くの事実のために ServiceLocator が本当に好きではありません:
- 暗黙の依存関係を維持するのが難しくなります。
- コードのテストが難しくなります。
- 潜在的なスレッドの問題。
- ServiceLocator のみへの明示的な依存関係。
- コードがわかりにくくなります。
- テスト中に ServiceLocator インターフェイスを登録する必要があります。
しかし一方で、単純な POCO オブジェクトでは、ServiceLocator を使用せずに IoC/DI のみを使用して上記のような検証を実行する方法は他にありません。
現在、私はサービス層でそのような種類の検証を行っています。そのため、アクターがユーザー名を変更しようとするたびに (もちろん別のものかもしれません)、サービスはこの検証を実行します。明らかな欠点の 1 つは、User を使用するすべてのサービスがこのチェックを実行する必要があることです (1 回の呼び出しであっても)。
質問は次のとおりです。上記の状況で DI/IoC を使用する方法はありますか?
ありがとう、
ドミトリー。