/// <summary>
        /// Castle.Windsor 환경설정 정보에 있는 값을 해당 형식의 생성자에 제공하여 인스턴스를 빌드한다.
        /// </summary>
        /// <param name="value">인스턴싱할때 생성자에 제공할 인자 값</param>
        /// <param name="targetType">인스턴싱할 형식</param>
        /// <returns></returns>
        public override object PerformConversion(string value, Type targetType) {
            targetType.ShouldNotBeNull("targetType");

            if(IsDebugEnabled)
                log.Debug("Perform conversion configuration value to property. value:{0}, targetType:{1}", value, targetType);

            return ActivatorTool.CreateInstance(targetType, new object[] { value });
        }
Example #2
0
        /// <summary>
        /// Static 생성자
        /// </summary>
        static SqlCommandSet() {
            if(log.IsInfoEnabled)
                log.Info("SqlCommandSet을 Aseembly [{0}] 로부터 동적으로 로드합니다... ", SystemDataAssemblyName);

            _sqlCommandSetType = Assembly.Load(SystemDataAssemblyName).GetType(SqlCommandSetTypeName);
            _sqlCommandSetType.ShouldNotBeNull("Type of SqlCommandSet");

            if(log.IsInfoEnabled)
                log.Info("[{0}]을 Aseembly [{1}]로부터 동적으로 로드했습니다!!!", SqlCommandSetTypeName, SystemDataAssemblyName);
        }
Example #3
0
        public DynamicAccessor(Type targetType, bool suppressError = false, bool ignoreCase = false) {
            targetType.ShouldNotBeNull("targetType");

            if(log.IsInfoEnabled)
                log.Info("DynamicAccessor를 생성합니다. targetType=[{0}], suppressError=[{1}], ignoreCase=[{2}]",
                         targetType.FullName, suppressError, ignoreCase);

            TargetType = targetType;
            SuppressError = suppressError;
            IgnoreCase = ignoreCase;

            // 미리 준비하도록 합니다.
            Task.Factory.StartNew(() => {
                                      var ignoredPropertyMap = PropertyMap;
                                      var ignoredFieldMap = FieldMap;
                                  },
                                  TaskCreationOptions.LongRunning);
        }
        /// <summary>
        /// Castle.Windsor 환경설정 정보에 있는 속성정보를 Instance의 속성 값으로 매핑한다.
        /// </summary>
        /// <param name="configuration">Castle configuration object</param>
        /// <param name="targetType">target type</param>
        /// <returns></returns>
        public override object PerformConversion(IConfiguration configuration, Type targetType) {
            configuration.ShouldNotBeNull("configuration");
            targetType.ShouldNotBeNull("targetType");

            if(IsDebugEnabled)
                log.Debug("Perform conversion configuration value to property. configuration={0}, targetType={1}",
                          configuration, targetType);

            var instance = ActivatorTool.CreateInstance(targetType);

            var accessor = DynamicAccessorFactory.CreateDynamicAccessor(targetType, false);

            const BindingFlags flags = BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;

            foreach(var itemConfig in configuration.Children) {
                var propInfo = targetType.GetProperty(itemConfig.Name, flags);

                // convert from string to object
                var value = Context.Composition.PerformConversion(itemConfig.Value, propInfo.PropertyType);
                accessor.SetPropertyValue(instance, itemConfig.Name, value);
            }
            return instance;
        }
Example #5
0
        /// <summary>
        /// 개방된 Generic 수형을 <paramref name="innerTypes"/>의 Closed Generic 수형으로 만들고, 인스턴스를 생성해서 반환합니다.
        /// </summary>
        /// <param name="genericTypeDefinition">Opened Generic Type</param>
        /// <param name="innerTypes">Generic의 내부 수형</param>
        /// <param name="args">생성자의 인자들</param>
        /// <returns></returns>
        public static object CreateGeneric(Type genericTypeDefinition, Type[] innerTypes, params object[] args) {
            genericTypeDefinition.ShouldNotBeNull("genericTypeDefinition");
            innerTypes.ShouldNotBeNull("innerTypes");

            if(IsDebugEnabled)
                log.Debug("Generic 수형의 인스턴스를 생성합니다. GenericType=[{0}], innerTypes=[{1}], args=[{2}]",
                          genericTypeDefinition.FullName, innerTypes.CollectionToString(), args.CollectionToString());

            Type genericType = MakeGenericType(genericTypeDefinition, innerTypes);
            return ActivatorTool.CreateInstance(genericType, args);
        }
Example #6
0
 /// <summary>
 /// 개방된 Generic 수형을 <paramref name="innerType"/>의 Closed Generic 수형으로 만들고, 인스턴스를 생성해서 반환합니다.
 /// </summary>
 /// <param name="genericTypeDefinition">Opened Generic Type</param>
 /// <param name="innerType">Generic의 내부 수형</param>
 /// <param name="args">생성자의 인자들</param>
 /// <returns></returns>
 public static object CreateGeneric(Type genericTypeDefinition, Type innerType, params object[] args) {
     innerType.ShouldNotBeNull("innerType");
     return CreateGeneric(genericTypeDefinition, new Type[] { innerType }, args);
 }
Example #7
0
        /// <summary>
        /// 개방된 Generic 수형을 <paramref name="innerTypes"/> 들로 Closed Generic 수형을 생성합니다.
        /// </summary>
        /// <param name="genericTypeDefinition"></param>
        /// <param name="innerTypes"></param>
        /// <returns></returns>
        public static Type MakeGenericType(Type genericTypeDefinition, params Type[] innerTypes) {
            genericTypeDefinition.ShouldNotBeNull("genericTypeDefinition");
            innerTypes.ShouldNotBeEmpty("innerTypes");
            Guard.Assert(() => genericTypeDefinition.IsGenericTypeDefinition, @"Type [{0}] is not a generic type definition.",
                         genericTypeDefinition);

            return genericTypeDefinition.MakeGenericType(innerTypes);
        }
Example #8
0
        /// <summary>
        /// <paramref name="triggerType"/>의 <see cref="Trigger"/> 컴포넌트를 Resolve 합니다.
        /// </summary>
        /// <param name="triggerType"></param>
        /// <returns></returns>
        public static Trigger ResolveTrigger(Type triggerType) {
            triggerType.ShouldNotBeNull("compoentType");

            if(IsDebugEnabled)
                log.Debug(@"TriggerType [{0}] 에 해당하는 Trigger Component를 Resolve합니다...", triggerType);

            var trigger = IoC.Resolve<Trigger>(triggerType);

            if(IsDebugEnabled)
                log.Debug(@"TriggerType [{0}] 에 해당하는 Trigger Component를 Resolve했습니다!!! Trigger=[{1}]", triggerType, trigger);


            return trigger;
        }
Example #9
0
        /// <summary>
        /// 특정 수형의 속성 값을 설정하기 위한 <see cref="MemberSetter"/>를 가져옵니다. 없으면 새로추가합니다.
        /// </summary>
        /// <param name="propertySetters">속성 설정 Setter들의 Dictionary</param>
        /// <param name="targetType">대상 형식</param>
        /// <param name="propertyName">속성 명</param>
        /// <param name="exceptionAction">예외 시 실행할 Action</param>
        /// <returns></returns>
        public static MemberSetter GetOrAddPropertySetter(this IDictionary<string, MemberSetter> propertySetters,
                                                          Type targetType,
                                                          string propertyName,
                                                          Action<Exception> exceptionAction = null) {
            propertySetters.ShouldNotBeNull("propertySetters");
            targetType.ShouldNotBeNull("targetType");
            propertyName.ShouldNotBeWhiteSpace("propertyName");

            MemberSetter propertySetter;

            if(propertySetters.TryGetValue(propertyName, out propertySetter))
                return propertySetter;

            try {
                propertySetter = targetType.DelegateForSetPropertyValue(propertyName, DefaultFlags);

                if(propertySetters is ConcurrentDictionary<string, MemberSetter>) {
                    ((ConcurrentDictionary<string, MemberSetter>)propertySetters).AddOrUpdate(propertyName, propertySetter,
                                                                                              (k, v) => propertySetter);
                }
                else {
                    lock(propertySetters) {
                        if(propertySetters.ContainsKey(propertyName) == false) {
                            propertySetters.Add(propertyName, propertySetter);

                            if(IsDebugEnabled)
                                log.Debug("수형[{0}]의 속성[{1}]의 MemberSetter를 만들어서 캐시합니다.", targetType.FullName, propertyName);
                        }
                    }
                }
            }
            catch(Exception ex) {
                if(exceptionAction != null)
                    exceptionAction(ex);
                else {
                    if(log.IsWarnEnabled) {
                        log.Warn("수형[{0}]의 속성[{1}]의 MemberSetter를 만들어서 캐시하는데 예외가 발생했습니다!!! 무시합니다.", targetType.FullName, propertyName);
                        log.Warn(ex);
                    }
                }
            }

            return propertySetter;
        }
Example #10
0
        /// <summary>
        /// 특정 수형의 필드 값을 설정하기 위한 <see cref="MemberSetter"/>를 가져옵니다. 없으면 새로 추가합니다.
        /// </summary>
        /// <param name="fieldSetters">필드 값을 조회하는 MemberGetter들의 Dictionary</param>
        /// <param name="targetType">대상 형식</param>
        /// <param name="fieldName">필드명</param>
        /// <param name="exceptionAction">예외 시 수행할 Action</param>
        /// <returns></returns>
        public static MemberSetter GetOrAddFieldSetter(this IDictionary<string, MemberSetter> fieldSetters,
                                                       Type targetType,
                                                       string fieldName,
                                                       Action<Exception> exceptionAction = null) {
            fieldSetters.ShouldNotBeNull("fieldSetters");
            targetType.ShouldNotBeNull("targetType");
            fieldName.ShouldNotBeWhiteSpace("fieldName");

            MemberSetter fieldSetter;

            if(fieldSetters.TryGetValue(fieldName, out fieldSetter))
                return fieldSetter;

            try {
                fieldSetter = targetType.DelegateForSetFieldValue(fieldName, DefaultFlags);

                if(fieldSetters is ConcurrentDictionary<string, MemberSetter>) {
                    ((ConcurrentDictionary<string, MemberSetter>)fieldSetters).AddOrUpdate(fieldName, fieldSetter, (k, v) => fieldSetter);
                }
                else {
                    lock(fieldSetters)
                        if(fieldSetters.ContainsKey(fieldName) == false) {
                            fieldSetters.Add(fieldName, fieldSetter);

                            if(IsDebugEnabled)
                                log.Debug("수형[{0}]의 필드[{1}]의 MemberSetter를 만들어서 캐시합니다", targetType.FullName, fieldName);
                        }
                }
            }
            catch(Exception ex) {
                if(exceptionAction != null)
                    exceptionAction(ex);

                else if(log.IsWarnEnabled) {
                    log.Warn("수형[{0}]의 필드[{1}]의 MemberSetter를 만들어서 캐시하는데 예외가 발생했습니다!!! 무시합니다.", targetType.FullName, fieldName);
                    log.Warn(ex);
                }
            }

            return fieldSetter;
        }
Example #11
0
 public IInternalLogger LoggerFor(Type type) {
     type.ShouldNotBeNull("type");
     return LoggerFor(type.FullName);
 }