2017-03-20 18 views
0

これはいくつかのバリエーションがありますが、コンストラクタでサービスを初期化するのではなく、コードをリファクタリングする方法についてのガイダンスが必要です。コントローラコンストラクタではあるが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プロパティを対応するプライベートプロパティで確実に登録する必要があります。

答えて

0

これは私がそれを解決することになった方法です:

public abstract class BaseController : Controller 
    { 
     private Dictionary<Type, dynamic> _dacRepository = new Dictionary<Type, dynamic>(); 

     public T GetDAC<T>() where T : BaseDAC 
     { 
      Type dac = typeof(T); 
      if (!_dacRepository.ContainsKey(dac)) { 
       _dacRepository.Add(dac, Activator.CreateInstance(dac, UserID, LicenceID, SubscriptionLevel, AdditionalPermissions)); 
      } 

      return _dacRepository[dac]; 
     } 
} 

そしてコントローラーのいずれかでそれを使用して:

var dac = GetDAC<ProductDAC>(); 

私にとって、それはDACをretreivingの非常に簡単な方法を提供しました必要なパラメータを同じ場所に配置します(将来の変更の場合)。

関連する問題