次のエラーが発生します。値をnullにすることはできません。パラメータ名:プリンシパルコントローラのコンストラクタ内でUser.GetUserId()が失敗する
コントローラのコンストラクタ内でID(userId)にアクセスするにはどうすればよいですか?私は、失敗した呼び出しを関数内で折り返すことによってのみ動作させることができます(両方とも下に強調表示されています)。
注射が必要なものはありますか?
次のエラーが発生します。値をnullにすることはできません。パラメータ名:プリンシパルコントローラのコンストラクタ内でUser.GetUserId()が失敗する
コントローラのコンストラクタ内でID(userId)にアクセスするにはどうすればよいですか?私は、失敗した呼び出しを関数内で折り返すことによってのみ動作させることができます(両方とも下に強調表示されています)。
注射が必要なものはありますか?
@Henkが述べたようにするactionContextが設定されている前に、コントローラのコンストラクタは、実行されますContext
、Request
、User
などのプロパティにはアクセスできません。要求のコンテキスト内でuserIdを取得する必要があります。
まだIAsyncActionFilter
で非同期アクションフィルタをサポートしているMVC6パイプラインの一部であるaction filtersの旧式のアプローチを使用できます。
コントローラにプロパティを設定する必要があるため、これを実装する最も簡単な方法は、コントローラクラスのOnActionExecuting
メソッドをオーバーライドすることです。これは、すでにIActionFilter
を実装しているController
から継承しているために機能します。
public override void OnActionExecuting(ActionExecutingContext context)
{
//Get user id
userId = User.GetUserId();
}
編集
あなたがチェックした場合DefaultControllerFactory
あなたはそれが表示されます。
DefaultControllerPropertyActivator
ビア(設定されていますプロパティアクチベータの1つ): var controller = _controllerActivator.Create(actionContext, controllerType);
foreach (var propertyActivator in _propertyActivators)
{
propertyActivator.Activate(actionContext, controller);
}
コントローラがインスタンス化されると、要求情報がまだHttpContextで利用可能であるという保証はありません。要求は全くないかもしれません。コンストラクタでその情報が必要な理由はありますか?
私はあなたの問題を理解しています。私は通常、このようなシナリオでは何、唯一のコントローラごとに一度照会バッキングフィールドを持つプロパティを作成することです:
private int? _userId;
public int UserId
{
get
{
if (!_userId.HasValue)
{
// query from db.
_userId = 42;
}
return _userId.Value;
}
}
お返事ありがとうございます。はい、私はすべての私のAPIコントローラは、このいわゆる 'BaseController'から継承する。そのユーザーIDを使用して、アプリケーション全体で使用される他の値を公開します。たとえば、userIdはユーザーのcompanyIdを照会するために使用されます。このcompanyIdは、すべてのコントローラーがその値を継承できるように、このコントローラーのメンバーにもなります。各コントローラには、それらの値(userIdとcompanyId)が必要な多くのクエリが存在するためです。ですから、すべてのコントローラでクエリを実行することなく、すべてのコントローラで使用できるようにするための変数がいくつかあります。 – Toonsylvania
@トーンシルバニア私はあなたの懸念を理解しています。私は例を追加しました。 –
ありがとう!それはまさに私が探していたものであり、説明に感謝します:) – Toonsylvania