0

私は構造マップが初めてです。カスタム検証クラスにプロパティ インジェクションを使用すると、プロパティは常に 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>();
    }
   }
4

0 に答える 0