모델 클래스는 종속성 삽입의 일부가 아니어야합니다. 또한 그들 만의 유효성 검증을 책임 져야하지 않습니다 (유효성 검증 속성을 사용하여 그것들을 꾸미기도 - 단지 메타 데이터 일뿐입니다 - 괜찮을 것입니다).
대신 유효성 검사를 수행 할 적절한 추상화를 정의하십시오. 특정 유형의 IValidator<T>
인터페이스의 0, 1, 또는 여러 구현을 가질 수
public interface IValidator<T>
{
ValidationResult Validate(T instance);
}
이 방법, 당신은 Autofac 모든 꽤 효과적으로을 등록 할 수 있습니다 : 예를 들어,이 추상화를 정의합니다.
유형이 더 검증이없는 경우 컨테이너가 기본적으로 비어 있음 구현 다시 전달하도록 할 수 있습니다 : 당신이 복합에서 그들을 포장 수, 유형이 정의 된 여러 유효성 검사기가있는 경우
// Implementation of the Null Object pattern
public class EmptyValidator<T> : IValidator<T>
{
public ValidationResult Validate(T instance)
{
return ValidationResult.ValidResult;
}
}
을 :
// Implementation of the Composite pattern
public class CompositeValidator<T> : IValidator<T>
{
private readonly IEnumerable<Validator<T>> col;
public CompositeValidator(IEnumerable<Validator<T>> col)
{
this.col = col;
}
public ValidationResult Validate(T instance)
{
ValidationResult total = ValidationResult.ValidResult;
foreach (var validator in this.col)
{
var result = validator.Validate(instance);
total = ValidationResult.Append(total, result);
}
return total;
}
}
웹 API 컨트롤러에 IValidator<T>
을 직접 삽입하는 대신 IRepository<T>
인터페이스를 둘러싸는 데코레이터를 만듭니다. 이렇게하면 리포지토리를 변경하지 않고도 유효성 검증 동작을 추가 할 수 있습니다. 이러한 구현은 다음과 같을 수 있습니다.
public class ValidationRepositoryDecorator<T>
: IRepository<T>
{
private readonly IRepository<T> decorated;
private readonly IValidator<T> validator;
public ValidationRepositoryDecorator(
IRepository<T> decorated,
IValidator<T> validator)
{
this.decorated = decorated;
this.validator = validator;
}
public void Save(T instance)
{
var result = this.validator.Validate(instance);
if (!results.IsValid)
new ValidationException(result);
this.decorated.Save(instance);
}
}
Autofac을 사용하면 데코레이터를 등록 할 수 있습니다.
이 기사에 관심이있는 것 같습니다. http://aspnetwebstack.codeplex.com/workitem/463이 기능이 실제로 구현되어야합니다. 그렇게한다면 투표 할 수 있습니다. – tugberk