1// あるクラスのインジェクションに関係する情報を集める2// これは関数で支持を出しても良いし、よりよい形ではリフレクションでも良い3BindingInfo<T> Bind<T>()4{5// このコンストラクタにどんな情報があるかを事前にまとめておくためのクラスがあるとして6 var info = new BindingInfo(typeof(T));78// まずは器を用意しておく9 cache[typeof(type)]= info;1011return info;12}1314// で、実装クラスの関連情報を作成した収集クラスに集める15public class BindingInfo<T>16{17// 例えばある型と紐づける18 public BindedTypeInfo To(Type type)19{20// 紐づける型が派生形であることを調べる21 this.Type.IsAssignableFrom(type);2223// C#だとこんな風にコンストラクタの一覧はとってこれるし24 var constructors = type.GetConstructors();25foreach(var constructor in constructors)26{27// ConstructorInfoからはGetParametersとかで引数はとってこれる28 this.Add(new BindingConstructorInfo(constructor));2930// そもそも、ConstructorInfoは実行できる31// constructor.Invoke(/*引数はオブジェクトの配列*/);32}33}3435// もしくはあるインスタンスと紐づけたり36 public BindedTypeInfo ToConstant(T value)37{38// ここでは、この型情報のインスタンスが欲しい時に39// ここで受け取ったvalueを返すようにする4041// で、紐づけられた関連情報を更にreturn することによって42// 細かいオプションを足せるようにしてもいいだろうね!43}44}4546// DIコンテナで値を取得するときは、再帰的に生成を行っていく47public T Get<T>()48{49// ある型の情報からインスタンスを取るために必要なものを考える50 var info = cache[typeof(T)];51// 例えばinfoがコンスタントならその値を返すだろうし52if(info.IsConstant)53{54return info.ConstantValue;55}56else57{58// じゃなくてインスタンスを生成しなければならないなら59// 必要なコンストラクタの引数を生成するために再帰的にGet<T>する60 var constructor = info.GetConstructor();61 var parameters = new List<object>();62foreach(var parameterInfo in constructor.GetParameters())63{64// Getメソッドを再帰的に呼び出せばいつか端にたどり着く65 parameters.Add(this.Get(parameterInfo.ParameterType));66}6768// で、生成したパラメータを使ってコンストラクタを実行する69return constructor.Invoke(parameters);70}71}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/17 11:41
2017/05/17 11:43 編集
退会済みユーザー
2017/05/17 12:36