2

サービススタックの流暢な検証 API フックを介して接続したカスタムバリデータ内からユーザーのAuthSessionにアクセスする最良の方法を考えていました。基本的に、要件により、「DocNumberValidator」と呼ばれるクラスを使用して、このバリデーターを介してデータベースにアクセスする必要があります。ユーザーの ID は、認証時にセッションに保存されます。この情報は、SQL クエリを正常に完了するために必要です。このセッション情報にアクセスするにはどうすればよいですか (以下を参照してください....)。IoC コンテナに AuthSession への参照がありませんか?

  • 問題は、誰かが必要なセッション値を SS 検証フレームワークによって呼び出されるクラスにどのように渡すかということだと思います。

サンプルコード:


public class MyValidator : AbstractValidator<Statuses>
{
    public IDocNumberValidator DocNumberValidator { get; set; }

    public StatusesValidator()
    {
        RuleFor(s => s.DocNumber)
              .Must(docNum => this.DocNumberValidator.Validate(docNum))
              .WithMessage("Document Number is invalid.")
              .WithErrorCode("S-001");
    }
}

 public class DocNumberValidator : IDocNumberValidator
{
    public IDbConnectionFactory Db { get; set; }

    public bool Validate(string docNum)
    {
        var isFound = false;
        this.Db.Run(conn =>
            {
                var sql = "SELECT COUNT([docNumber]) FROM [TABLE] WHERE [docNumber] = @DocNum AND [UserId] = @UserID";
                var cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                cmd.Parameters.Add(new SqlParameter("@DocNum", docNum));
                cmd.Parameters.Add(new SqlParameter("@UserID", ????????)); // how does one get access to saved users session here
                int cnt = (int) cmd.ExecuteScalar();
                if (cnt == 1)
                    isFound = true;

            });

        return isFound;
    }
}
4

1 に答える 1

1

これが最善の方法であるかどうかはよくわかりません。提案を受け付けます。

  • SessionFeature.GetSessionKey() を使用してセッション キーを取得します
  • バリデーターに追加public ICacheClient CacheClient { get; set; }します。IoC コンテナーによって注入されます
  • キーを使用してキャッシュから AuthUserSession (または使用している任意のタイプ) を取得します。

あなたの例に追加

public class DocNumberValidator : IDocNumberValidator
{
    public IDbConnectionFactory Db { get; set; }
    public ICacheClient CacheClient { get; set; }

    public bool Validate(string docNum)
    {
        var isFound = false;
        var sessionKey = SessionFeature.GetSessionKey();
        var user = CacheClient.Get<AuthUserSession>(sessionKey); //Use whatever class you stored in the session

        this.Db.Run(conn =>
            {
                var sql = "SELECT COUNT([docNumber]) FROM [TABLE] WHERE [docNumber] = @DocNum AND [UserId] = @UserID";
                var cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                cmd.Parameters.Add(new SqlParameter("@DocNum", docNum));
                cmd.Parameters.Add(new SqlParameter("@UserID", user.UserAuthId)); // user whatever property you need access to
                int cnt = (int) cmd.ExecuteScalar();
                if (cnt == 1)
                    isFound = true;

            });

        return isFound;
    }
}
于 2013-04-23T21:23:41.060 に答える