/// <summary> /// コンストラクタ /// </summary> /// <param name="container">コンポーネントを登録するコンテナ</param> /// <param name="type">登録するコンポーネントの型</param> /// <param name="name">登録するコンポーネントの名前</param> public SingletonComponentEntry(IComponentContainer container, Type type, string name) { componentType = type; componentName = name; componentInstance = null; injectionConstructorFunctor = null; foreach (ConstructorInfo ci in componentType.GetConstructors()) { if (Attribute.IsDefined(ci, typeof(InjectionPointAttribute))) { ArrayList arguments = new ArrayList(); foreach (ParameterInfo param in ci.GetParameters()) { if (Attribute.IsDefined(param, typeof(ExplicitComponentAttribute))) { ExplicitComponentAttribute eca = (ExplicitComponentAttribute)Attribute.GetCustomAttribute (param, typeof(ExplicitComponentAttribute)); arguments.Add(eca.CreateProvider(container)); } else { arguments.Add(new TypedArgumentComponentProvider(container, param.ParameterType)); } } injectionConstructorFunctor = new BindFunctor(new ConstructorFunctor(ci), arguments.ToArray()); } } foreach (MethodInfo mi in componentType.GetMethods()) { if (Attribute.IsDefined(mi, typeof(InjectionPointAttribute))) { ParameterInfo[] paramerters = mi.GetParameters(); ArrayList arguments = new ArrayList(); arguments.Add(new NotBoundArgument(0)); foreach (ParameterInfo param in paramerters) { arguments.Add(new TypedArgumentComponentProvider(container, param.ParameterType)); } injectionFactors.Add(new BindFunctor(new MemberFunctor(mi), arguments.ToArray())); } } foreach (MethodInfo mi in componentType.GetMethods()) { if (Attribute.IsDefined(mi, typeof(InitializationPointAttribute))) { initializationFactors.Add(new MemberFunctor(mi)); } } }
public void TestBindFunctor() { IFunctor methodFunctor = new MemberFunctor(typeof(TestClass).GetMethod("Print")); IFunctor bindFunctor = new BindFunctor( methodFunctor, new NotBoundArgument(0), "BindFunctorTest Start", "1", "2", "BindFunctorTest End"); bindFunctor.Invoke(new TestClass()); }
/// <summary> /// 依存性を注入するための引数をバインド済みの関数オブジェクトを追加する /// </summary> /// <param name="functor">追加する関数オブジェクト</param> public void AddInjectionFanctor(BindFunctor functor) { injectionFactors.Add(functor); }