2016-07-19 4 views
0

私は、IISでホストされているWebAPI2アプリケーション内で私の結合モデルを検証するための責任があるCreateAccountValidatorクラスを作成しました。それは私がデータベースにその事実を記録したいfalseを返す場合、私は、私のカスタムバリデータを呼び出していFluentValidationアクセスIOwinContext - 取得要求IPとアクセスApplicationDbContext

public class CreateAccountValidator : AbstractValidator<CreateAccountBindingModel> 
{ 
    public CreateAccountValidator() 
    { 
     RuleFor(u => u.Amount) 
      .Cascade(CascadeMode.StopOnFirstFailure) 
      .GreaterThan(0).WithMessage("Must be greater than 0"); 

     RuleFor(u => u.FirstName) 
      .Cascade(CascadeMode.StopOnFirstFailure) 
      .NotEmpty().WithMessage("Name is required") 
      .Length(3, 20).WithMessage("Name must be between 3 and 20 characters"); 

     RuleFor(u => u.LastName) 
      .Cascade(CascadeMode.StopOnFirstFailure) 
      .NotEmpty().WithMessage("Surname is required") 
      .Length(3, 20).WithMessage("Surname must be between 3 and 20 characters"); 

     RuleFor(u => u.ID) 
      .Cascade(CascadeMode.StopOnFirstFailure) 
      .NotEmpty().WithMessage("ID is required") 
      .Must(ValidateId).WithMessage("ID is invalid"); 
    } 

    private bool ValidateId(CreateAccountBindingModel createAccountBindingModel, string id, PropertyValidatorContext context) 
    { 
     var id_valid = IdValidator.IsValid(id); 
     if (!id_valid) 
     { 
      using (var db = new ApplicationDbContext()) 
      { 
       //get request IP!!! 
       db.SaveAlert(createAccountBindingModel.UserEmail, "ID - CHECKSUM", string.Format("User entered: {0}", id), "192.100.100.100"); 
       return false; 
      } 
     } 
     return true; 
    } 
} 

方法ValidateId内部:

以下は私のクラスです。

は私がリクエストIPを取得する必要がありますが、私はそれを行うことができますどのように私は知りません。 IOwinContextプロパティまたはRequestプロパティはありません。アピコントローラ内部で私が呼んでいる:

Request.GetOwinContext().Get<ApplicationDbContext>()

私は自分のアプリケーション内のクラスからIOwinContextにアクセスすることはできますか?はいです、どうすればいいですか?

+0

私は 'FluentValidation'でデータベースの検証を行うかどう知りません。それは正しいとは思わない。 'FluentValidation'はユーザ入力が有効であることを確認するための単純なガード句のセットのように思えます。あなたはDI注入し、クラスでそれを使用することができますので、第二に、あなたDIは、 'DbContext'とOWINコンテキストを提供する必要があります。 –

+0

@CallumLinington私はちょうど '' Startup.cs'の中で 'app.CreatePerOwinContext(()=>新しいApplicationDbContext())を使用しています。 1つの場所ですべてを検証し、私の質問に示されているようにFluentValidationを使用している理由のすべてのエラーも記録したいと思います。だから、私は他のクラスの中のそのOWINコンテキストにどのようにアクセスできますか?私はDIシステムを使わなければならないのですか? – Misiu

+0

'FluentValidationModelValidatorProvider.Configure(GlobalConfiguration.Configuration);' –

答えて

1

のでHttpContextは、ASP.NETで静的です。

のでHttpContext.Current.Request.GetOwinContext()

しかし、あなたは私がそれをされて

理由を変更しないだろう、あなたの質問やで正しくApplicationDbContextを使用している、あなただけの作業の最小単位の周りに新しいコンテキストをインスタンス化したいです可能。あなたが絶対に正しく行ったこと。

+0

ありがとうございます。大量の時間を節約できました。 – Misiu

関連する問題