私は構造マップが初めてです。カスタム検証クラスにプロパティ インジェクションを使用すると、プロパティは常に null になります。私は何かが欠けていると思います。この点での助けは高く評価されます。System.Web.Mvc.DependencyResolver.Current.GetService(); を使用したくありません。AddressInfoValidator で logger のインスタンスを取得します。依存関係を注入するために、MVC 5、FluentValidation.Mvc(5.1.0.0)、および構造マップ(2.6.3.0) を使用しています。シンプルなログ ファサードと Myloger クラスがあります。
public class LogingFacade : ILogingFacade
{
private IMyLoger loger;
LogingFacade(IMyLoger myLoger)
{
this.loger = myLoger;
}
public void SaveToLog()
{
this.loger.SendError();
}
}
public class MyLoger : IMyLoger
{
public void SendError()
{
//send to DB
}
}
バリデーターの実装は次のとおりです。以下のクラスが属性として使用されるため、プロパティ注入を使用しました。
public class AddressInfoValidator : AbstractValidator<AddressInfo>, IValidatorInterceptor
{
public AddressInfoValidator()
{
this.RuleFor(x => x.StreetAddress).NotEmpty().Length(1, 50);
this.RuleFor(x => x.UnitNumber).Length(0, 20);
this.RuleFor(x => x.City).NotEmpty().WithMessage(UIErrorMessages.MSG_UI_00001).Length(1, 50).WithMessage(UIErrorMessages.MSG_UI_00002);
this.RuleFor(x => x.State).NotEmpty();
this.RuleFor(x => x.ZipCode).NotEmpty().Length(1, 20).Matches("\\d{5}");
}
[SetterProperty]
public ILogingFacade Logger { get; set;}
public ValidationResult AfterMvcValidation(ControllerContext controllerContext, ValidationContext validationContext, ValidationResult result)
{
try
{
result.Errors.ToList().ForEach(r =>
{
this.Logger.SaveToLog(new ValidationError { PropertyName = r.PropertyName, AttemptedValue = r.AttemptedValue, ErrorMessage = r.ErrorMessage });
});
}
catch (System.AggregateException)
{
// TODO log the exception
}
return result;
}
public ValidationContext BeforeMvcValidation(ControllerContext controllerContext, ValidationContext validationContext)
{
return validationContext;
}
}
アドレス モデルは次のとおりです。
[Validator(typeof(AddressInfoValidator))]
public class AddressInfo
{
public string StreetAddress{ get; set;}
public string UnitNumber{ get; set;}
public string ZipCode{ get; set;}
public string City
public string State{ get; set;}
}
global.asax で起動時にアプリケーションから呼び出される構造マップ レジストリ:
[CLSCompliant(false)]
public class ServiceUiWebRegistry : Registry
{
public ServiceUiWebRegistry()
{
this.For<IMyLoger>().Use<IMyLoger>();
this.For<ILogingFacade>().Use<LogingFacade>();
this.FillAllPropertiesOfType<ILogingFacade>();
}
}