/// <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 }); }
/// <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); }
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; }
/// <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); }
/// <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); }
/// <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); }
/// <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; }
/// <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; }
/// <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; }
public IInternalLogger LoggerFor(Type type) { type.ShouldNotBeNull("type"); return LoggerFor(type.FullName); }