これはいくつかのバリエーションがありますが、コンストラクタでサービスを初期化するのではなく、コードをリファクタリングする方法についてのガイダンスが必要です。コントローラコンストラクタではあるがHttpContextを必要とするサービスを初期化する
だから、私はそのコンストラクタでプロパティを設定する(.NETコアMVCにおける)基本的なコントローラを有する:(AuthorisedControllerに継承された)ベースのコントローラで
public class ProductsController : AuthorisedController
{
private readonly ProductDAC _productDAC;
public ProductsController()
{
_productDAC = new ProductDAC(UserID, LicenceID, SubscriptionLevel, AdditionalPermissions);
}
}
を、読み取り専用プロパティがあります。
public List<Claim> UserClaims
{
get
{
if (User == null || User?.Claims == null) return new List<Claim>();
return User.Claims.ToList();
}
}
public string UserID { get
{
return UserClaims.SingleOrDefault(a => a.Type == "sub")?.Value;
}
}
ここで、HttpContextがまだ設定されていないため、コントローラのコンストラクタからフェッチすると、Userは常にnullになります。
だから、各アクションでDACを登録するのではなく、1か所でDACを登録できるようにするにはどうすればよいでしょうか?
私は基本コントローラーのsetting it as a readonly propertyを見ましたが、それは私がBaseControllerのすべてのDACプロパティを対応するプライベートプロパティで確実に登録する必要があります。