我在我的项目中使用了 Validationaspect, 我有流畅的验证规则,这些是简单的规则,比如不接受字段空白。 验证在调试器模式下工作,抛出 fluentvalidation.validationexception
在调试器模式下一切正常!!!
using Castle.DynamicProxy;
public class ValidationAspect:MethodInterception
{
Type _validatorType;
public ValidationAspect(Type validatorType)
{
if(!typeof(IValidator).IsAssignableFrom(validatorType))
{
//farkli validator yollandı
throw new System.Exception(AspectMessages.WrongValidationType);
}
_validatorType = validatorType;
}
protected override void OnBefore(IInvocation invocation)
{
var validator = (IValidator)Activator.CreateInstance(_validatorType);
var entityType = _validatorType.BaseType.GetGenericArguments()[0];
var entities = invocation.Arguments.Where(t => t.GetType() == entityType);
foreach (var entity in entities)
{
ValidationTool.Validate(validator,entity);
}
}
}
public static class ValidationTool
{
public static void Validate(IValidator validator, object entity)
{
var context = new ValidationContext<object>(entity);
var result = validator.Validate(context);
if (result.Errors.Count > 0)
{
throw new ValidationException(result.Errors);
}
}
}
为什么测试方法不抛出验证异常,方法有效?
[TestClass]
public class PersonManagerTest
{
[TestMethod]
[ExpectedException(typeof(ValidationException))]
public void product_add_validation_check()
{
Mock<IPersonDal> mock = new Mock<IPersonDal>();
PersonManager productManager = new PersonManager(mock.Object);
productManager.AddPerson(new Person());
}
}
[ValidationAspect(typeof(PersonValidation), Priority =0)]
//[CacheRemoveAspect(pattern: "*IPersonService*",Priority =2)]
public IResult AddPerson(Person person)
{
IResult result = BusinessRules.Run(
CheckIfPersonFullNameExists(person.PersonFirstName, person.PersonLastName));
if (result != null)
{
return result;
}
_personDal.Add(person);
return new SuccessResult(Messages.PersonAddedSuccess);
}
public abstract class MethodInterception : MethodInterceptionBaseAttribute
{
protected virtual void OnBefore(IInvocation invocation) { }
protected virtual void OnAfter(IInvocation invocation) { }
protected virtual void OnException(IInvocation invocation, System.Exception e) { }
protected virtual void OnSuccess(IInvocation invocation) { }
public override void Intercept(IInvocation invocation)
{
var isSuccess = true;
OnBefore(invocation);
try
{
invocation.Proceed();
}
catch (Exception e)
{
isSuccess = false;
OnException(invocation, e);
throw;
}
finally
{
if (isSuccess)
{
OnSuccess(invocation);
}
}
OnAfter(invocation);
}
}
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple =true,Inherited =true)]
public abstract class MethodInterceptionBaseAttribute:Attribute,IInterceptor
{
public int Priority { get; set; }
public virtual void Intercept(IInvocation invocation)
{
}
}