0

私はいくつかのasp.netカスタムサーバーコントロールを作成しており、コントロールが必要とする依存関係を注入する方法に関するベストプラクティスを探しています.

これを行う方法を決定する際に考慮している要素がいくつかあります

。1) マークアップを介してこの依存関係を注入するのはどれほど簡単か
2) コード ビハインドを介してこの依存関係を挿入するのはどれほど簡単でしょうか。
3) この注入は、コントロールのライフ サイクルのできるだけ早い段階で行う必要があります。できれば、コントロールのすべての依存関係を OnInit() で使用できるようにする必要があります。

これらの要因に基づいて、私がこれを行うことを考えることができる唯一の方法は、依存関係に完全な品質タイプを持つコントロールに文字列プロパティを持たせることです。コントロールが初期化されると、その型をロードして、必要な処理を実行できます。


public class MyControl : CompositeControl
{     

     public string RepositoryType { get; set; }     
     protected IRepository Repository { get; set; }

     protected override void OnInit()
     {
          EnsureChildControls();
     }

     protected override void CreateChildControls()
     {
          if (!ChildControlsCreated)
          {
              Repository = ComponentFactory.Instanciate(RepositoryType);
          }
     }
}

私はいつもこの種の状況に遭遇し、他の誰かが依存関係を注入するために別の/より良い/異なるものを見つけたのではないかと思っていました。
ありがとう :)

4

1 に答える 1

1

私が行ったことは、コントロールの初期化、DI コンテナーのクエリ、およびそれらの参照の入力です。このロジックは、カスタム サーバー コントロールが継承できる特別な基本クラスに入れ子にすることができるため、再利用できます。または:コントロールがコントロール ツリーに追加されるたびに呼び出される特別なAddedControlメソッドがあります。ここでの注意点は、おそらく親コントロールのメソッドを呼び出すだけで、上に伝播しないことです。シナリオによっては機能する場合があります。

ライフサイクルには、コントロールがいつ作成されたか (プロセスの最初に実行される AddedControl メソッドまたは Init メソッド以外) を知ることができるものはあまりなく、カスタマイズすることもできません。コントロールのコンストラクタ。

1 に関しては、マークアップ アプローチを使用するには、コントロールの設計時の側面を利用し、設計時の属性を最大限に活用する必要があります。しかし、#1 はマークアップでマッピングを定義することを意味し、これは DI コンテナーの要点ではありません。デザイナーは、参照を割り当てるプロパティまたは何かをまだ必要としているため、DI コンテナーがそれを処理する場合、基本的に、プロパティを定義してからデザイナーで何かを定義するという 2 つの作業になります。

于 2013-09-20T15:30:37.070 に答える